【问题标题】:How to post a form as a View Model object, along with other parameters to the controller in MVC? [duplicate]如何将表单作为 View Model 对象以及其他参数发布到 MVC 中的控制器? [复制]
【发布时间】:2016-11-16 15:43:24
【问题描述】:

我在控制器中有一个动作:

public int Edit(MyViewModel viewModel)
{
     // code to edit
}

我正在发布一个表格:

$.post("/MyController/Edit", $("#form").serialize()).then(
  function () {
    $("#dialog1").dialog("close");
    $("#list-grid").trigger('reloadGrid');
});

这很好用。我得到的参数格式和MyViewModel一样。

但是,我需要再向操作传递一个参数。所以我将控制器更改为:

public int Edit(MyViewModel viewModel, string oldValue)
{
      // code to edit
}

现在,我尝试使用以下方式通过 ajax 调用将 viewModeloldValue 传递给操作:

var object = $("#form").serialize();
$.ajax({
        url: '@Url.Action("Edit", "MyController")',
        type: "POST",            
        contentType:                            // please see below            
        data: { viewModel: object, oldValue: oldVal},
        dataType:                               // please see below
        contentType: 'application/json',
        success: function (response) {
                alert("Successfully updated!");
               }
}); 

虽然我能够得到oldValue 的值,但viewModel 的值是null,尽管在控制台中检查时它与$.post(...) 中发送的值完全相同。

如果我将contentType 指定为以下任何一个:

application/x-www-form-urlencoded; charset=UTF-8 或,

application/json; charset=utf-8 或,

application/json

调用失败。

我尝试过不指定dataType,也尝试将其指定为json,但没有成功。

创建自定义类来反序列化发送的json 是不可行的。

我该如何解决这个问题?

【问题讨论】:

  • 试试这个:data: JSON.stringify({ viewModel: object, oldValue: oldVal})
  • 您可以使用$.param() 向序列化对象添加额外的名称/值对 - 请参阅this answer
  • 我改为使用.serializeArray() 并添加了一个新字段。如果您需要在序列化表单中编辑一些值,这是一个更好的选择。

标签: json ajax asp.net-mvc


【解决方案1】:

假设oldVal 的值不为NULL。你可以试试这个:

var object = $("#form").serialize();
$.ajax({
        url: '@Url.Action("Edit", "MyController")',
        type: "POST",            
        contentType: application/json; charset=utf-8                           // please see below            
        data: JSON.stringify{ viewModel: object, oldValue: oldVal},
        success: function (response) {
                alert("Successfully updated!");
               }
}); 

【讨论】:

    【解决方案2】:

    data: { viewModel: object, oldValue: oldVal}之前添加dataType: "JSON",

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多