如何在 jQuery $.ajax() 发布请求中向 MVC 控制器方法发送模型

Posted

技术标签:

【中文标题】如何在 jQuery $.ajax() 发布请求中向 MVC 控制器方法发送模型【英文标题】:How to send a model in jQuery $.ajax() post request to MVC controller method 【发布时间】:2010-12-03 20:32:15 【问题描述】:

在使用以下代码进行自动刷新时,我假设当我发布帖子时,模型会自动发送到控制器:

$.ajax(
    url: '<%=Url.Action("ModelPage")%>',
    type: "POST",
    //data:  ??????
    success: function(result) 
        $("div#updatePane").html(result);
    ,

    complete: function() 
    $('form').onsubmit( preventDefault: function()   );

    
);

每次有帖子,我需要增加模型中的value属性:

public ActionResult Modelpage(MyModel model)
                       
        model.value = model.value + 1;

        return PartialView("ModelPartialView", this.ViewData);
    

但是当页面使用 jQuery AJAX 请求发布时,模型并没有传递给控制器​​。如何在 AJAX 请求中发送模型?

【问题讨论】:

已经回答了,对我有帮助...看看@ ***.com/questions/7910033/…> 【参考方案1】:

简单的答案(从 MVC 3 开始,甚至可能是 2)是您不必做任何特别的事情。

只要您的 JSON 参数与模型匹配,MVC 就足够智能,可以根据您提供的参数构造一个新对象。不存在的参数只是默认的。

例如,javascript

var values = 

    "Name": "Chris",
    "Color": "Green"


$.post("@Url.Action("Update")",values,function(data)

    // do stuff;
);

型号:

public class UserModel

     public string Name  get;set; 
     public string Color  get;set; 
     public IEnumerable<string> Contacts  get;set; 

控制器:

public ActionResult Update(UserModel model)

     // do something with the model

     return Json(new  success = true );

【讨论】:

这是否适用于模型包含部分视图的自定义对象的场景?像里面的值数组有属性"Customer" : "Name":"N" , ..." 在 ajax 成功中如何引用联系人,例如 Contact.Name、Contact.Phone 等?【参考方案2】:

如果您需要将 FULL 模型发送到控制器,您首先需要该模型可用于您的 javascript 代码。

在我们的应用中,我们使用扩展方法来做到这一点:

public static class JsonExtensions

    public static string ToJson(this Object obj)
    
        return new JavaScriptSerializer().Serialize(obj);
    

在视图上,我们用它来渲染模型:

<script type="javascript">
  var model = <%= Model.ToJson() %>
</script>

然后您可以将模型变量传递给您的 $.ajax 调用。

【讨论】:

这很好,但是非常没用,如果你在页面上更改模型,模型就会被渲染,如果你在页面上修改它(我认为在网页上是正常的)你传递一个发布操作的空模型。 @Laviak 这个方法似乎不错,但在这种情况下返回空模型:我提交带有填充模型的表单,如果出现错误,表单从控制器返回。在这种情况下,模型不是空的,而是在使用此方法时将一个空模型发送到控制器。如何解决? @theLaw 有什么办法解决这个问题吗?【参考方案3】:

我有一个 MVC 页面,它从一组单选按钮提交所选值的 JSON。

我用:

var dataArray = $.makeArray($("input[type=radio]").serializeArray());

将它们的名称和值组成一个数组。然后我将其转换为 JSON:

var json = $.toJSON(dataArray)

然后使用 jQuery 的 ajax() 将其发布到 MVC 控制器

$.ajax(
url: "/Rounding.aspx/Round/" + $("#OfferId").val(),
type: 'POST',
dataType: 'html',
data: json, 
contentType: 'application/json; charset=utf-8',
beforeSend: doSubmitBeforeSend,
complete: doSubmitComplete,
success: doSubmitSuccess);

将数据作为原生 JSON 数据发送。

然后您可以捕获响应流并将其反序列化为本地 C#/VB.net 对象并在控制器中对其进行操作。

为了以一种可爱、低维护的方式自动化这个过程,我建议阅读这篇文章,它很好地说明了大部分原生的自动 JSON 反序列化。

匹配您的 JSON 对象以匹配您的模型,并且下面的链接过程应自动将数据反序列化到您的控制器中。它对我来说非常有用。

Article on MVC JSON deserialization

【讨论】:

提供的链接已失效。【参考方案4】:

这可以通过构建一个 javascript 对象来匹配您的 mvc 模型来完成。 javascript 属性的名称必须与 mvc 模型完全匹配,否则自动绑定不会在帖子上发生。在服务器端建立模型后,您就可以对其进行操作并将数据存储到数据库中。

我通过网格行上的双击事件或某种按钮上的单击事件来实现这一点。

@model TestProject.Models.TestModel

<script>

function testButton_Click()
  var javaModel =
  ModelId: '@Model.TestId',
  CreatedDate: '@Model.CreatedDate.ToShortDateString()',
  TestDescription: '@Model.TestDescription',
  //Here I am using a Kendo editor and I want to bind the text value to my javascript
  //object. This may be different for you depending on what controls you use.
  TestStatus: ($('#StatusTextBox'))[0].value, 
  TestType: '@Model.TestType'
  

  //Now I did for some reason have some trouble passing the ENUM id of a Kendo ComboBox 
    //selected value. This puzzled me due to the conversion to Json object in the Ajax call. 
  //By parsing the Type to an int this worked.

  javaModel.TestType = parseInt(javaModel.TestType);

  $.ajax(
      //This is where you want to post to.
      url:'@Url.Action("TestModelUpdate","TestController")', 
      async:true,
      type:"POST",
      contentType: 'application/json',
      dataType:"json",
      data: JSON.stringify(javaModel)
  );

</script>


//This is your controller action on the server, and it will autobind your values 
//to the newTestModel on post.

[HttpPost]
public ActionResult TestModelUpdate(TestModel newTestModel)

 TestModel.UpdateTestModel(newTestModel);
 return //do some return action;

【讨论】:

【参考方案5】:

我认为您需要显式传递 data 属性。一种方法是使用 数据 = $('#your-form-id').serialize();

这篇文章可能会有所帮助。 Post with jquery and ajax

看看这里的文档.. Ajax serialize

【讨论】:

我想传递模型而不仅仅是表单数据 当您在接受适当模型的操作上使用 form.serialize() 时,映射会自动完成。因此,在您提出此请求时,“MyModel”实例将填充表单值。【参考方案6】:

您可以创建一个变量并发送到 ajax。

var m =  "Value": @Model.Value 

$.ajax(
    url: '<%=Url.Action("ModelPage")%>',
    type: "POST",
    data:  m,
    success: function(result) 
        $("div#updatePane").html(result);
    ,

    complete: function() 
    $('form').onsubmit( preventDefault: function()   );

    
);

模型的所有字段都必须以 m 为单位。

【讨论】:

【参考方案7】:

在ajax调用中提到-

data:MakeModel(),

使用下面的函数将数据绑定到模型

function MakeModel() 

    var MyModel = ;

    MyModel.value = $('#input element id').val() or your value;

    return JSON.stringify(MyModel);

将 [HttpPost] 属性附加到您的控制器操作

在 POST 后,此数据将可用

【讨论】:

以上是关于如何在 jQuery $.ajax() 发布请求中向 MVC 控制器方法发送模型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Yii 中禁用 Ajax 请求的 jQuery 自动加载?

如何使用 jQuery 在 JSON ajax 请求中回调 404 上的函数?

如何在 jQuery 中使用 Ajax 请求发送 FormData 对象? [复制]

如何在 jQuery 中使用 Ajax 请求发送 FormData 对象? [复制]

如何在 jQuery 中使用 Ajax 请求发送 FormData 对象? [复制]

如何在 jQuery 中发送带有 Ajax 请求的 FormData 对象? [复制]