下面的代碼會在第一個下拉列表更改(即級聯下拉列表)時填充第二個下拉列表。但是,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調用指定錯誤路徑的任何輸入?
有趣。使其絕對(即增加主導斜線)似乎解決了這個問題。這很有趣,因爲我的這段代碼的其他實現沒有前導斜槓並且工作正常(對於前導斜槓也能正常工作,所以我將它放在兩個位置)。 – gfrizzle 2009-05-15 14:31:18
前導斜槓使您的網址絕對。當代碼停止時,我敢打賭你在一個子目錄中。 – 2009-05-17 23:22:17