如何将表单作为View Model对象以及其他参数发布到MVC中的控制器?

时间:2016-11-16 15:43:25

标签: json ajax asp.net-mvc

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

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
}

现在,我尝试按照以下方式将viewModeloldValue一起传递给使用ajax调用的操作:

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进行反序列化是不可行的。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

假设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!");
               }
}); 

答案 1 :(得分:0)

Dim ctrl As CommandButton Private Sub CommandButton1_Click() Set ctrl = Me.Controls.Add(bstrProgID:="Forms.commandbutton.1", Name:="CommandButton1", Visible:=True) End Sub

之前添加dataType: "JSON",