2009-05-14 24 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> 

很抱歉的混亂

而現在,我將試圖教我的奶奶吸雞蛋。 ;)

相關問題