ASP.NET MVC Ajax函数是否一直失败?

时间:2016-12-18 19:48:58

标签: jquery ajax asp.net-mvc

我想知道为什么AJAX调用的函数在这种情况下会失败?当FillObj()选择发生变化时,应该调用dropdownlist

    <div class="form-group">
        @Html.LabelFor(model => model.Module, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.Module, new SelectList(Model.ModuleList, "Value", "Text"),
     "- Please select a Module -", new { @onchange = "FillObj()", @class = "form-control" })
        </div>
    </div> 

正如您所见,我已在@onchange代码中将FillObj()设置为Dropdownlist。但是,当选择发生变化时,它会保持alert('A error')而不是成功。以下是AJAX function

function FillObj() {
    var moduleID = $('#Module').val();
    $.ajax({
        url: '/Questions/FillObjectives',
        type: "GET",
        dataType: "JSON",
        data: { module: moduleID },
        success: function (objectives) {
            $("#objective").html(""); // clear before appending new list
            $.each(objectives, function (i, Obj) {
                $("#objective").append(
                    $('<option></option>').val(Obj.ObjectiveId).html(Obj.objective));
            });
        },
        error: function () {
            alert('A error');
        }

    });
}

控制器:

public ActionResult FillObjectives(int module)
{
    var objectives = db.Objectives.Where(o => o.ModuleId == module);
    return Json(objectives, JsonRequestBehavior.AllowGet);
}

编辑1:

好的,我做了一些调试,发现只要调用该函数就会出现此错误消息:

enter image description here

无论如何要解决这个问题?

1 个答案:

答案 0 :(得分:1)

请参阅编辑1中的编辑

如果您使用GET呼叫您的操作,则无法在正文中发送数据。你不能这样做:

data: { module: moduleID },

您可以将其作为查询字符串附加到网址的末尾。

url: '/Questions/FillObjectives?module=' + moduleID,

或者您可以将通话更改为POST,但请确保您的操作未应用HttpGet属性。

编辑1

感谢Stephen Muecke的评论,上面我说不应该进行GET操作data { module: moduleID }。这是正确的一半。由于这个答案被推翻了几次,我分享这个,所以其他人,在同样的印象下,会知道这是不正确的。如果发布的内容已经是string,则无效。如果它不是字符串,jQuery会将其转换为字符串并将其附加到URL。这是来自jQuery docs:

  

要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它已附加到GET请求的URL。

在发布的问题中,它不是一个字符串,因此jQuery会将数据转换为字符串并将其附加到url。

因此,总的来说,这个问题中发布的代码会起作用,但它出错的原因是控制器中的代码错误输出。如果你在控制器中执行此操作,它将在客户端成功:

public ActionResult FillObjectives(int module)
{
     var data = new[]{ new { ObjectiveId = 1, objective = "Option 1" }, new { ObjectiveId = 2, objective = "Option 2" } };
     return Json(data, JsonRequestBehavior.AllowGet);
}

所以最有可能的问题是这行代码:

var objectives = db.Objectives.Where(o => o.ModuleId == module);