2009-05-14 46 views
0

下面的代码会在第一个下拉列表更改(即级联下拉列表)时填充第二个下拉列表。但是,Ajax调用并未触发,我无法弄清楚原因。我没有收到任何语法或运行时错误。在调试模式下,GetPlans操作永远不会被调用。内部警报永远不会被调用,但外部警报是。更糟的是,这个相同的设置在我的应用程序的其他地方工作!这里的所有相关部件(让我知道如果我省略了一些重要的细节):Ajax查询不会触发,因为它会生成错误的URL

“报告/验证” 观点:

<script type="text/javascript" src="../../Scripts/jquery-1.3.2.min.js"></script> 

<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script> 

<script type="text/javascript"> 

    $(function() { 
     $("#year").change(function() { 

      var year = $("#year > option:selected").attr("value"); 
      var rid = $("#rid").attr("value"); 

      $.ajax({ 
       type: "GET", 
       contentType: "application/json; charset=utf-8", 
       url: "GetPlans/" + rid + "/" + year, 
       data: "{}", 
       dataType: "json", 
       success: function(data) { 
        alert('inside'); 
        if (data.length > 0) { 
         var options = ''; 
         for (p in data) { 
          var plan = data[p]; 
          options += "<option>" + plan + "</option>"; 
         } 
         $("#plan").html(options); 

        } else { 
         $("#plan").html(''); 
        } 
       } 
      }); 

      alert("outer"); 
     }); 
    }); 

</script> 

<% Using Html.BeginForm()%> 
<%=Html.Hidden("rid")%> 
Year: 
<%=Html.DropDownList("year", Model.Years)%> 
Plan: 
<%=Html.DropDownList("plan")%> 
<% End Using%> 

ReportController:

Function Auth(ByVal rid As Integer) As ActionResult 

    ViewData("plan") = New SelectList(New List(Of SelectListItem)) 
    Return View(New Auth) 

End Function 

Public Function GetPlansByYear(ByVal rid As Integer, ByVal year As Integer) As JsonResult 

    Dim plans = _ 
     (From bp In BenefitDataContext.GetContext.BenefitPlans _ 
     Where bp.Benefit.repository_id = rid _ 
     And bp.Benefit.plan_year_val = year _ 
     Select bp.MphcPlan).Distinct 

    Return New JsonResult _ 
     With {.Data = _ 
       From p In plans _ 
       Select New SelectListItem _ 
        With {.Text = p.plan_code & " - " & p.plan_desc, _ 
          .Value = p.plan_id}} 

End Function 

验证类:

Public Class Auth 

    Private _years As SelectList 
    Public Property Years() As SelectList 
     Get 
      Return _years 
     End Get 
     Set(ByVal value As SelectList) 
      _years = value 
     End Set 
    End Property 

    Public Sub New() 

     Dim disinctYears = _ 
      (From b In BenefitDataContext.GetContext.Benefits _ 
      Where b.repository_id = 1 _ 
      Select b.plan_year_val).Distinct 

     Dim yearList = _ 
      From y In disinctYears _ 
      Order By y _ 
      Select New SelectListItem _ 
       With {.Text = y, _ 
         .Value = y, _ 
         .Selected = (y = Now.Year)} 

     Years = New SelectList(yearList, "Value", "Text") 

End Sub 

的Global.asax - 注册路线:

routes.MapRoute(_ 
    "AuthReportGetPlans", _ 
    "GetPlans/{rid}/{year}", _ 
    New With {.controller = "Report", .action = "GetPlansByYear", .rid = "", .year = ""} _ 
) 

关于如何弄清楚发生了什么的任何想法?

更新:通过检查Ajax调用的错误输出发现问题,所以现在我知道问题的原因:URL被追加到当前路径而不是从路由调用,即/ Reports/Auth/GetPlans/1/2009而不是/ GetPlans/1/2009。这是令人困惑的,因为它似乎在global.asax中正确设置了映射到我设置的路由,并且如前所述,我在另一个视图中设置了它,并且在那里工作正常。关于为什么Ajax调用指定错误路径的任何输入?

回答

2

难道不打网址呢?也许你应该让你的URL绝对:

url: "/GetPlans/" + rid + "/" + year 

也可以尝试结合,而不是立即(文件)。就绪$上的动作()。

+0

有趣。使其绝对(即增加主导斜线)似乎解决了这个问题。这很有趣,因为我的这段代码的其他实现没有前导斜杠并且工作正常(对于前导斜杠也能正常工作,所以我将它放在两个位置)。 – gfrizzle 2009-05-15 14:31:18

+0

前导斜杠使您的网址绝对。当代码停止时,我敢打赌你在一个子目录中。 – 2009-05-17 23:22:17

2

尝试捕捉阿贾克斯调用的错误事件,看看它是否会告诉你任何额外的信息

$.ajax({ 
    type: "GET", 
    contentType: "application/json; charset=utf-8", 
    url: "GetPlans/" + rid + "/" + year, 
    data: "{}", 
    dataType: "json", 
    success: function(data) { 
     alert('inside'); 
     if (data.length > 0) { 
      var options = ''; 
      for (p in data) { 
       var plan = data[p]; 
       options += "<option>" + plan + "</option>"; 
      } 
      $("#plan").html(options); 
     } else { 
      $("#plan").html(''); 
     } 
    }, 
    error: function(xhr){ 
     alert('something is b0rked') 
     // take a look at xhr.status and xhr.responseText 
    } 
}); 
+0

这正是我所错过的。电话是轰炸,但没有告诉我为什么。现在我知道它将URL附加到当前路径(原始问题已更新,详细信息)。非常感谢 - 这会派上用场。 – gfrizzle 2009-05-15 14:20:34

0

检查以确保MicrosoftAjax.js没有为其自己的目的使用$。

如果是,你可以找到关于如何使用超过$其他的东西在这个page

的信息。例如:

var $jQuery = jQuery.noConflict(); 


$jQuery(function() { 
    $jQuery("#year").change(function() { 

     var year = $jQuery("#year > option:selected").attr("value"); 
     var rid = $jQuery("#rid").attr("value"); 

     $jQuery.ajax({ ... 

...

0

愚蠢的问题。 ..你确定你的脚本路径是正确的吗?我不得不做一些黑客来确保我处在正确的位置(请参阅this thread

我不是一个巨大的jQuery用户(我知道的很少,因此很危险),我会试图确保通过坚持

alert('Yep, I'm running'); 

某处在您的功能。

编辑

我指着没有具体解决路径问题的线索。 Basicvally我有一个名为GetRootPath一个辅助方法,它返回站点的根,我打电话jQuery的文件如下

<script src="<%= Html.GetBasePath() %>Scripts/jQuery.js" type="text/javascript"></script> 

很抱歉的混乱

而现在,我将试图教我的奶奶吸鸡蛋。 ;)

相关问题