2010-11-26 21 views
0

我想重用一些現有的模型(尤其是與它們相關的加載/保存函數),所以我已經將它們聚合到當前型號:ASP.NET MVC 2.0:使POST動作接收我的模型的子模型

public class EditModel { 
    public SubModel1 {get; set; } 
    public SubModel2 {get; set; } 
    /* ID and some text fields */ 
} 

的問題是,當我填寫表格,並點擊提交,與帖子相關聯的這些子模型都默認/空內容的行動。

/// POST for Edit 
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult EditCommunity(EditCommunityModel model) { 
     if (bad stuff happened) 
      return Json("Failure"); 
     //model.SubModel1 is != null, but all fields are empty. 
     // ID and the aforementioned text fields come correctly. 
     Save(model.ID, model.SubModel1, model.SubModel2); 
     return Json("Succeeded"); 
    } 

在編輯等效項中使用.aspx時,我沒有問題地完成了這個重用,因此會調用GET Action來正確地構造模型。但是現在我被限制在一個ascx中,因爲我試圖在一個模式對話框中進行編輯(如果有一種方法可以在div中加載一個aspx,那麼這個問題就結束了;但是對我而言,這會違背什麼是aspx的意圖。)

這是,總之,我正在嘗試做什麼;我還會添加兩個我嘗試應用的策略,它們都具有相同的效果:空子模型。

第一次嘗試使用AJAX調用來填充Edit.ascx。 在Edit.ascx,對於編輯對話框包裝被列入Manage.aspx和EditModel無需任何初始化

<div id="editDialog" style="display: none;"> 
     <% Html.RenderPartial("Edit", new EditModel()); %> 
    </div> 

在網格中傳遞,細胞將被標記爲編輯和點擊將調用以下javascript函數:

function onSelectRowEdit_Click(id) { 
     if (id) { 
      //Get data from selected row 
      var ret = jQuery("#table_grid").getRowData(id); 
      //Show Edit modal control 
      var actionUrl = '<%= Url.Action("EditInfo", "Manage") %>'; 
      var data = "externalId=" + ret.OrgId + '&Id=' + ret.Id; 
      $.ajax({ 
       type: "POST", 
       url: actionUrl, 
       data: data, 
       error: AjaxError, 
       success: ShowEdit 
      }); 
    } 
} 

EditInfo(string, string)將創建並返回一個JsonResult,然後將其通過ShowEdit接收; showEdit將填補Edit.ascx和使用jQuery呈現DIV作爲一個對話框:

function ShowRes(ret) { 
     $("#form_Edit").validate(); 
     jQuery("#editDialog").dialog('destroy'); 
     Init_EditDialog(); 

     /* $('#...').val(ret...);, many times over */ 

     //Show Dialog 
     $("#editCommunityDialog_Content").show(); 
     $("#editCommunityDialog").dialog('open'); 
    } 

第二次嘗試試圖繞過new EditModel(),並使用由控制器返回的視圖。它確實實現了第一次嘗試所做的,代碼少得多,但在提交時遇到同樣的問題。

<div id="editDialog" style="display: none;"></div> 
<!-- ... --> 
function onSelectRowEdit_Click(id) { 
     if (id) { 
      //Get data from selected row 
      var ret = jQuery("#table_communities").getRowData(id); 
      //Show Edit community modal control 
      var actionUrl2 = '<%= Url.Action("ShowEdit", "Manage", 
       new { CommunityId="_COMMID_", ExternalId="_ORGID_" }) %>'; 
      editImg = editImg.replace("_COMMID_", ret.Id); 
      editImg = editImg.replace("_ORGID_", ret.OrgID); 
      $.ajax({ 
       type: "POST", 
       url: actionUrl2, 
       data: data, 
       error: AjaxError, 
       success: ShowRes 
      }); 
     } 
    } 

ShowEdit被改寫返回View("Edit", model),並ShowRes只會把結果寫入到div的HTML。

function ShowRes(ret) { 
     //... 
     $("#editDialog_Content").html(ret); 
     //Show Dialog 
    } 

不用說,在Edit.ascx形式有一個像<%= Html.HiddenFor(m => m.SubModel1.EditProfile)%>領域所以這不是問題出在哪裏得來的。

回答

0

嘗試檢查出我在這個問題的答案,看看是否有幫助:How to handle `PartialRender` Models?

+0

本文以及其家屬都覺得很有趣;不幸的是,它不適用於我的情況:我的索引(Basket)的等價物是`ShowEdit(string communityId,string externalId)`; ModelState只包含這兩個值,所以沒有什麼可以清除的(另外,它們是Edit.ascx用途的常量,所以它們實際上很有用)。但它確實指出了一個有趣的事實:在EditCommunity(EditCommunityModel模型)中,ModelState僅包含Id和非子模型字段; 'ModelState [「SubModel1_EditProfile」]'的行沒有任何內容 – Liz 2010-11-26 13:30:48