Asp.net-Mvc

通過 MVC4 中的表單發布 JSON 數據

  • November 4, 2012

我正在嘗試將一個 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...
           }
       });
   });
});

引用自:https://stackoverflow.com/questions/13196645