2010-08-11 76 views
0

我一直在找論壇2天,現在找不到一個好的答案,所以我只是發佈它。MVC2通過json發送來自控制器視圖的集合

我似乎有問題發佈JSON回控制器保存。 JSON應映射到模型視圖,但它始終獲取默認(構造函數)值而不是來自POST的值。

我們有一系列JS小部件,它們包含一個帶有json的數據字段。我們在客戶端的這些小部件對象中處理所有的數據操作。當用戶想要保存時,我們從所涉及的小部件獲取我們需要的數據,然後將其放入另一個JSON對象,該對象將ViewModel和POST返回給服務器。

例如:

$("#Save").click(function() { 
     if (itemDetails.preparedForSubmit() && itemConnections.preparedForSubmit()) { 
      itemComposite.data.Details = itemDetails.data; 
      itemComposite.data.Connections= itemConnections.data; 
      $.post(MYURL, itemComposite.data); 
     } else { 
      alert("failed to save"); 
     } 
    }); 

的preparedForSubmit()方法簡單做的東西像任何驗證檢查或最後一分鐘格式化你可能需要做客戶端。

itemDetails小部件數據與ViewModel匹配。

itemConnections小部件數據與ViewModels的集合相匹配。

的控制器是這樣的:

[HttpPost] 
    virtual public JsonResult SaveItemDetailsComposite(ItemComposite inItemData) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       _Mapper.Save(itemComposite.Details , itemComposite.Connections); 
       return Json(true);     
      } 
      catch (Exception ex) 
      { 
       _log.Error("Exception " + ex.InnerException.Message); 
       throw; 
      } 
     } 

     return Json(SiteMasterUtilities.CreateValidationErrorResponse(ModelState)); 
    } 

的ItemComposite類是包含單個itemDetails對象的簡單視圖模型和itemConnections的集合。當它將數據返回到此處時,它只是獲取默認數據,就好像它獲得了新的ItemComposite,而不是轉換POST數據。

in Firebug我看到數據已發佈。雖然它看起來很奇怪,不會自動格式化爲螢火蟲。

回答

0

謝謝大家。我想我已經解決了我的問題,我很確定我有四個問題。大多數情況下,我遵循了這個Steveguys的建議並閱讀了更多關於這篇文章的內容:http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx

使用jQuery的post()方法並將json指定爲類型似乎實際上並未將它作爲json發送。通過使用ajax()方法並指定json,它將它作爲json發送。

JSON。serialize()方法也需要乾淨地發送json。

此外,我的ViewModel設計是一個大問題。我們使用MS代碼分析構建垃圾,它不希望我在ViewModel中爲我的集合設置setter。所以我來自java/hibernate世界,認爲它不需要它們進行綁定,並且它會以神奇的方式作爲序列化對象進入。一旦我抑制了錯誤並重置了我的設置器。我現在正在控制器中獲取集合。

我相信使用MVC2未來的價值供應商正在做的事情,但它仍然沒有強勁轉換JSON日期,所以我仍然在調查的最好辦法做到這一點。

我希望我的問題能夠幫助別人。

更新:使用此方法更新數據集似乎超慢。一個包含200個條目和每個條目8個字段的集合需要3分鐘才能到達控制器。只有1或2個條目花費很少的時間。我知道的唯一事情就是在數據綁定到模型視圖之間。我不知道MVC2是否提供了發送這麼多數據並綁定它的簡單方法。

0

您可能希望查看像JSON.NET這樣的框架,以確保您的數據在被提供給Action時正確序列化。

JSON.NET好像它的主流框架之一:http://json.codeplex.com/releases/view/43775

希望這有助於。

Cory

+0

謝謝我是一個.net noob來自GWT env,我會閱讀它,看看它是如何工作的。 – 2010-08-11 23:59:37

1

你是說itemComposite.data被格式化爲JSON對象嗎?如果是這樣,我敢肯定你必須先將它反序列化,然後才能將它轉換爲對象。喜歡的東西:

ItemComposite ic = jsSerializer.Deserialize<ItemComposite>(this.HttpContext.Request.Params[0]); 
+0

我剛試過這個。它似乎給我與inItemData相同的結果。 Params [0]看起來像我的螢火蟲顯示我和IC看起來一樣inItemData。我確信這與我提出請求的方式或數據綁定的方式有關。 PARAMS [0]看起來像{%7B%22TaskDetails%22%3A%7B%7D%2C%22LaborTypes%22%3A%5B%7B%22LaborTypeID%22%3a93%2C%22LaborTypeID%22%... 3A1 – 2010-08-11 23:58:21

+0

你看到在螢火蟲的網 - >響應部分?如果是這樣,則編碼錯誤。它應該看起來像json對象,而不是一堆url編碼。既然你想直接發送一個Action Method參數,請看Haack的這篇文章,看看它是否有幫助:http://haacked.com/archive/2010/04/15/sending-json-to-an- ASP淨MVC-行動方法,argument.aspx – ThatSteveGuy 2010-08-12 03:17:39

相關問題