下面的代码会在第一个下拉列表更改(即级联下拉列表)时填充第二个下拉列表。但是,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