级联Combo JSON请求不会触发成功功能

时间:2013-08-20 22:03:36

标签: jquery asp.net-mvc json combobox

我有两个组合框:一个用于客户端,一个用于项目。我们的想法是,选择客户端后,将填充“项目”组合。在我的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) {

但结果相同,成功代码仍会被跳过。

1 个答案:

答案 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)
                    );
                });
            });