通过MVC4表单POST JSON数据(Post JSON data through a form

2019-07-03 13:09发布

我想发布一个JSON对象(JSON-指明分数淘汰赛模式,如果这是任何关联的)到我的MVC控制器,并有控制器返回一个新的视角。 要做到这一点,我有一个表单发送数据。 的问题是,我想有当所述控制器接收它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) {
    }
});

... JSON对象会成功反序列化,并转化为我的模型类的一个实例。

public ActionResult Preview(ActionModel actionModel) { ... }
public class ActionModel
{
    public List<ControlModel> Controls { get; set; }
}

如果我想用一个形式,要做到这一点,我明白,我需要的JSON插入一个隐藏的输入字段,但最好这样做是为了接收数据的序列化的字符串时,我可以管理:

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

public ActionResult Preview(string hiddenFieldName) { ... }

我可以反序列化之后,但我真的希望,如果MVC可以转换对我来说,因为它会与AJAX调用。 这可能吗?

谢谢。

Answer 1:

假设你要发布使用形式,没有XHR编码为JSON数据,我不认为这是开箱即用的可能。

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

如果您发布JSON作为一个字符串,它可能可以创建寻找这似乎是JSON和反序列化与处理字符串有一个模型粘合剂。 不是最漂亮的事情,尤其是如果这只是一些一次性奇怪的情况。



Answer 2:

取而代之的是手动反序列化的,你可以捕捉形式的事件后,重建自己的岗位,加入了额外的JSON对象。 这里是使用一个例子serializeObject方法从这篇文章 ):

$(document).ready(function () {
    $('form').live('submit', function (e) {
        e.preventDefault();

        var dataToPost = $(this).serializeObject();
        dataToPost.hiddenFieldName = actionModel; //additional object here
        $.ajax({
            type: $(this).attr('method'),
            url: $(this).attr('action'),
            data: JSON.stringify(dataToPost),
            contentType: 'application/json; charset=utf-8',
            success: function (res) {
                //do something...
            }
        });
    });
});


文章来源: Post JSON data through a form in MVC4