我有两个组合框:一个用于客户端,一个用于项目。我们的想法是,选择客户端后,将填充“项目”组合。在我的MVC代码中,组合看起来像:
@Html.DropDownListFor(Function(model) model.ClientID, New SelectList(Model.Clients, "ClientID", "Name"), New With {.id = "SelectedClientID"})
@Html.DropDownListFor(Function(model) model.ProjectID, Enumerable.Empty(Of SelectListItem), New With {.id = "SelectedProjectID"})
客户端组合的ID为SelectedClientID
且项目组合的ID为SelectedProjectID
。
我的问题是我的javascript,它会在选择客户端时在我的控制器中触发操作。
<script type="text/javascript">
$(function () {
$('#SelectedClientID').change(function () {
var selectedClientID = $(this).val();
$.getJSON('@Url.Action("GetProjects")', { ClientID: selectedClientID }, function (projects) {
var projectsSelect = $('#SelectedProjectId');
projectsSelect.empty();
$.each(projects, function (index, project) {
projectsSelect.append(
$('<option/>')
.attr('value', project.ProjectID)
.text(project.Name)
);
});
});
});
});
</script>
Function GetProjects(ClientID As Integer) As ActionResult
Return Json(db.ppProjects.Where(Function(c) c.ClientID = ClientID), JsonRequestBehavior.AllowGet)
End Function
此代码主要来自this example。当我调试时,我从客户端组合中选择一个客户端。这会触发.change
功能。正确调用GetProjects
Action并返回其JSON。但随后javascript就停止了。它之后从未进入代码,它会跳过所有成功函数function(projects)
。
可能导致这种情况发生的原因是什么?
我还尝试用同步调用替换我的$.getJSON
行,如下所示:
$.ajax({ datatype: "json", url: "GetProjects", data: { ClientID: selectedClientID}, async: false }).done(function (projects) {
但结果相同,成功代码仍会被跳过。
答案 0 :(得分:0)
您的代码看起来是正确的。尝试使用done()
代替成功回调:
$.getJSON('@Url.Action("GetProjects")', { ClientID: selectedClientID })
.done(function (projects) {
var projectsSelect = $('#SelectedProjectId');
projectsSelect.empty();
$.each(projects, function (index, project) {
projectsSelect.append(
$('<option/>')
.attr('value', project.ProjectID)
.text(project.Name)
);
});
});