Asp.net-Mvc
通過 MVC4 中的表單發布 JSON 數據
我正在嘗試將一個 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 呼叫一樣。這可能嗎?
謝謝。
假設您想使用表單而不是 XHR 發布編碼為 json 的數據,我認為它不可能開箱即用。
表單不允許許多內容類型。 http://www.w3.org/TR/html401/interact/forms.html#form-content-type
如果您將 json 作為字元串發布,則可能創建一個模型綁定器來查找看起來是 json 的字元串並在那里處理反序列化。不是最漂亮的東西,特別是如果這只是為了一些奇怪的情況。
除了手動反序列化,您可以擷取表單發布事件並重建您自己的文章,添加額外的 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... } }); }); });