使用 ajax 将字符串发送到 ActionResult

Sending a string to ActionResult using ajax

我正在尝试向控制器中的 ActionResult 发送一个字符串。我已经学习了许多教程并阅读了数百个 Whosebug,但无法使其正常工作。我正在尝试发送一个带有单选按钮值的字符串。

我的 ActionResult 代码是:

[HttpPost]
    public ActionResult Opslaan(string theStatus)
    {
        if(theStatus!= null)
            Database.UpdateAanvraagStatusByGuid(Session["Guid"].ToString(), theStatus);
        return new RedirectResult(Request.UrlReferrer.OriginalString);
    }

我的代码通过AJAX发送变量:

$("#opslaan").click(function (e) {
    e.preventDefault();

    var theStatus = $('input[name=StatusOptions]:checked').val();

    $.ajax({
        type: "POST",
        url: "/Aanvraag/Opslaan",
        data: theStatus,
        success: function (result) {
            if (result.Success) {
                alert("Uw wijzigingen zijn opgeslagen.");
            } else {
                alert(result.Message);
            }
        }
    });
});

当我单击名为 "opslaan" 的按钮时,程序不会执行 AJAX。它周围的警报确实消失了。

提前致谢:)

可能会有帮助:

[HttpPost]
    public ActionResult Opslaan(string id)
    {
        if(id != null)
            Database.UpdateAanvraagStatusByGuid(Session["Guid"].ToString(), id);
        // do your logic to check if success is true or false
        return Json(new { Success = true, Message = "something" });
    }

Javascript:

$("#opslaan").click(function (e) {
   e.preventDefault();

    var theStatus = $('input[name=StatusOptions]:checked').val();

$.ajax({
    type: "POST",
    url: "/Aanvraag/Opslaan/ " + theStatus ,
    //data: { 'theStatus': theStatus } ,
    success: function (result) {
        if (result.Success) {
            alert("Uw wijzigingen zijn opgeslagen.");
        } else {
            alert(result.Message);
        }
    }
});
});

编辑

只是为了看看它是否有效,更改 Action 中的参数名称和 Javascript。

像这样编辑 Fabio 的回答:

$("#opslaan").click(function (e) {
e.preventDefault();

var theStatus = $('input[name=StatusOptions]:checked').val();

$.ajax({
    type: "POST",
    url: "/Aanvraag/Opslaan?theStatus= " + theStatus ,
    //data: { 'theStatus': theStatus } ,
    success: function (result) {
        if (result.Success) {
          alert("Uw wijzigingen zijn opgeslagen.");
        } else {
          alert(result.Message);
        }
    }
    });
});

注意 url 属性 末尾的查询字符串。即使字符串是可空类型,如果您没有任何路由配置,如“/Aanvraag/Opslaan/theStatus”,路由系统将找不到匹配项。

这里有几点需要注意:

  • 您的原始解决方案确实显示了警报,这意味着请求已发送到服务器,并且已收到响应。
  • Fabio 的回答没有用,因为你(我猜)没有像 "/Aanvraag/Opslaan/theStatus" 这样的路线。即使 string 是可空类型——因此路由系统将允许字符串参数没有来自请求的传入值——客户端设置的 url 参数告诉路由系统 'Hey please forward me to something that is configured to a url like "/Aanvraag/Opslaan/theStatus"' .我确定您没有使用该模式设置任何路由,因此路由系统将无法找到匹配的 Controller/Action 方法对,从而导致 404.
  • 您原来的解决方案并没有导致这个问题,因为您将 theStatus 参数作为数据发送,而您的 url 是“/Aanvraag/Opslaan”。这意味着即使是默认路由也能发现Controller是'Aanvraag',controller是'Osplaan'。从那时起,模型绑定就可以将您的 theStatus 参数绑定到操作方法参数。 (如果不是,将调用正确的操作方法,只是为参数提供 null 值。)但是,您的响应没有发送任何带有 属性 [=18 的对象=] 返回,因此您的 if 语句转到 else 分支。

总而言之,您可以将 theStatus 参数作为数据发送并让模型绑定系统将其绑定到您的操作方法参数,或者使用路由为您完成此操作。在后一种情况下,您必须配置正确的路由条目或使用我的修改版本中的查询字符串。

要使 if 语句生效,您需要像 Fabio 那样发回具有 Success 属性 的内容。