我想重用一些現有的模型(尤其是與它們相關的加載/保存函數),所以我已經將它們聚合到當前型號: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)%>
領域所以這不是問題出在哪裏得來的。
本文以及其家屬都覺得很有趣;不幸的是,它不適用於我的情況:我的索引(Basket)的等價物是`ShowEdit(string communityId,string externalId)`; ModelState只包含這兩個值,所以沒有什麼可以清除的(另外,它們是Edit.ascx用途的常量,所以它們實際上很有用)。但它確實指出了一個有趣的事實:在EditCommunity(EditCommunityModel模型)中,ModelState僅包含Id和非子模型字段; 'ModelState [「SubModel1_EditProfile」]'的行沒有任何內容 – Liz 2010-11-26 13:30:48