通过MVC4中的表单发布JSON数据

Ale*_*ejo 10 asp.net-mvc json asp.net-mvc-4 knockout.js

我正在尝试将一个JSON对象(一个JSON-ified淘汰模型,如果有任何相关性)发布到我的MVC控制器,并让控制器返回一个新视图.为此,我将使用表单发送数据.问题是我希望在控制器收到JSON时自动将JSON转换为模型.

如果我要使用AJAX调用,

var actionModel = new Object();
actionModel.Controls = ko.toJS(self.controls());
var json = JSON.stringify(actionModel);
$.ajax({
    url: "MyController/Preview",
    type: "POST",
    contentType: 'application/json; charset=utf-8',
    cache: false,
    data: json,
    success: function (data) {
    }
});
Run Code Online (Sandbox Code Playgroud)

... JSON对象已成功反序列化并转换为我的模型类的实例.

public ActionResult Preview(ActionModel actionModel) { ... }
public class ActionModel
{
    public List<ControlModel> Controls { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果我想用表单执行此操作,我理解我需要将JSON插入到隐藏的输入字段中,但是在执行此操作时我能够管理的最佳方法是将数据作为序列化字符串接收:

@using (Html.BeginForm("Preview", "MyController", FormMethod.Post, new { id = "previewForm" }))
{
    <input type="hidden" id="hiddenFieldName" />
}

public ActionResult Preview(string hiddenFieldName) { ... }
Run Code Online (Sandbox Code Playgroud)

我之后可以反序列化它,但我真的更喜欢它,如果MVC可以为我转换它,就像使用AJAX调用一样.这可能吗?

谢谢.

Ken*_*Ito 2

假设您想使用表单发布编码为 json 的数据而不使用 XHR,我认为它不可能开箱即用。

表单不允许多种内容类型。 http://www.w3.org/TR/html401/interact/forms.html#form-content-type

如果您将 json 作为字符串发布,则可能会创建一个模型绑定器来查找看似 json 的字符串并在那里处理反序列化。这不是最漂亮的事情,特别是如果这只是针对某些奇怪的情况。