Следующий код заполняет второй раскрывающийся список при изменении первого раскрывающегося списка (т.е. каскадные раскрывающиеся списки). Однако вызов Ajax не запускается, и я не могу понять, почему. Я не получаю никаких синтаксических ошибок или ошибок времени выполнения. В режиме отладки действие GetPlans никогда не вызывается. Внутреннее оповещение никогда не вызывается, а внешнее. Что еще хуже, эта же настройка работает в другом месте в моем приложении! Вот все соответствующие части (дайте мне знать, если я пропустил некоторые важные детали):
Просмотр отчета / аутентификации:
<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 указывает неправильный путь?