【问题标题】:ASP.NET MVC Ajax function keep failing?ASP.NET MVC Ajax 功能不断失败?
【发布时间】:2016-12-18 19:48:58
【问题描述】:

我想知道为什么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> 

如您所见,我已经在Dropdownlist 代码中将@onchange 设置为FillObj()。 However, when the selection changes, it keep goes to alert('A error') instead of success.以下是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:

好的,我做了一些调试,发现每次调用函数都会出现这个错误信息:

要解决这个问题吗?

【问题讨论】:

  • 控制器动作是否被调用,使用调试器使用断点检查?
  • 并将Url.Action 用于类似以下网址:url: '@Url.Action("FillObjectives","Questions")'
  • 控制器参数需要一个整数。尝试将其更改为字符串:FillObjectives(string module)
  • @FernandaInesDuran 我认为这应该不是问题
  • 您在浏览器中遇到了什么错误。您显示的代码工作正常。最好的猜测是你的控制器中的代码抛出了一个异常——调试它!

标签: jquery ajax asp.net-mvc


【解决方案1】:

请参阅下面的编辑 1 中的编辑

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

data: { module: moduleID },

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

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

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

编辑 1

感谢 Stephen Muecke 的 cmets,上面我说过对于 GET 操作 data { module: moduleID } 不应该进行。那是对的一半。由于这个答案被多次投票,我分享这个是为了让其他有同样印象的人知道这不是真的。如果发布的内容已经是string,它将不起作用。如果它不是字符串,jQuery 会将其转换为字符串并将其附加到 URL。这是来自 jQuery 文档:

要发送到服务器的数据。如果还不是字符串,则将其转换为查询字符串。它附加到 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);

【讨论】:

  • 当然data: { module: moduleID }, 适用于 GET
  • 我不这么认为。请参阅 herehere。你为什么说它有效——我想知道。
  • 你应该先尝试一下 :) 并参考这个DotNetFiddle 来证明它
  • 也形成docs 要发送到服务器的数据。如果还不是字符串,则将其转换为查询字符串。它附加到 GET 请求的 url .....
  • 嘿@StephenMuecke,非常感谢你。老实说,我不知道 jQuery 会将其附加到 url 的这个小细节。无论如何,我真的很感谢你指出这一点。我编辑了我的答案,而不是简单地删除它,因为其他人也有同样的印象,并希望从中受益。
猜你喜欢
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多