Jquery 序列化 :尝试在不提交表单的情况下将表单状态传递给 ASP.NET MVC 控制器

Jquery serialize : trying to pass a form status to an ASP.NET MVC controller without submitting the form

本文关键字:表单 状态 ASP 控制器 MVC NET 序列化 Jquery 提交 情况下      更新时间:2023-09-26

正在开发一个 ASP.NET 的MVC应用程序。表单具有多个提交表单的按钮。其中一个按钮需要将窗体的控件状态发送到控制器,而无需提交窗体。我计划使用 Ajax 和 $('#FormID').serialize();

我是这样写的:

  function rechercher() {
        var formStatus = $('#FormID').serialize();
        var url = '@Url.Action("Search", "ImproItemForm"); //?'+ formStatus;
        // alert('formStatus: ' + formStatus); //works fine
         alert('url: ' + url);
        $.ajax({
            url: url,
            type: 'POST',
            dataType: 'json',
            data:/* { improItem: formStatus },*/  formStatus ,
            contentType: "application/json; charset=utf-8", 
            success: function (result) {
                   alert("success" + result);
            },
            error: function (result) {
                   alert("failure" + result);
            }
        });
    }

我的控制器操作如下:

public ActionResult Search(FormCollection improItem)
{
}

如果我以这种方式调用 ajax,它永远不会到达控制器(从而触发错误函数。

如果我评论这一行:

data: formStatus ,

然后它确实调用了控制器方法,但 FormCollection improItem 参数当然没有值。所以我想我没有将数据正确传递给 Ajax,但我无法对其进行排序。

提前感谢。

请确保指定正确的内容类型。现在您似乎已经指定了application/json; charset=utf-8但显然您没有发送任何 JSON,而是application/x-www-form-urlencoded这就是 .serialize() 方法格式化表单值的方式。所以只需摆脱这一行:

contentType: "application/json; charset=utf-8",

通常,当您不确定要发送或接收的内容而不是像您那样尝试显式指定它时,您最好不要指定任何内容并让jQuery弄清楚。当然,dataType: 'json',财产也是如此。如果控制器操作未返回 JSON,这将导致错误。另一方面,如果您没有指定预期的返回类型,那么 jQuery 将只使用服务器返回的 Content-Type 响应标头,它会弄清楚。

所以底线:把它留给框架弄清楚,除非你确切地知道你在做什么。

啊,在我忘记之前,请替换这个:

public ActionResult Search(FormCollection improItem)

跟:

public ActionResult Search(MyViewModel improItem)