【问题标题】:Post JSON data through a form in MVC4通过 MVC4 中的表单发布 JSON 数据
【发布时间】:2012-10-23 04:41:37
【问题描述】:

我正在尝试向我的 MVC 控制器发布一个 JSON 对象(一个 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) {
    }
});

...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 调用一样。这可能吗?

谢谢。

【问题讨论】:

    标签: asp.net-mvc json knockout.js asp.net-mvc-4


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的意见。我想我会把它作为一个字符串发送。这不是世界末日,因为我几乎可以在新页面中返回相同的 JSON,但我希望我可以使 Preview 操作与我的控制器的其余部分保持一致。
    【解决方案2】:

    您可以捕获表单发布事件并重建您自己的帖子,而不是手动反序列化,添加额外的 JSON 对象。这是一个使用来自this postserializeObject 方法的示例:

    $(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...
                }
            });
        });
    });
    

    【讨论】:

    • 我无法拦截和重建表单的发布请求,因为我需要将数据同步发送到控制器。例如。表单提交数据 -> 控制器接收数据(最好序列化到我的模型类中) -> 控制器在新网页中返回数据。
    猜你喜欢
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多