Asp.net mvc 2 ASP.NET MVC 2.0:使POST操作接收我的模型';s子模型
我试图重用一些现有模型(尤其是与它们相关联的加载/保存函数),因此我将它们聚合到当前模型中:Asp.net mvc 2 ASP.NET MVC 2.0:使POST操作接收我的模型';s子模型,asp.net-mvc-2,c#-4.0,Asp.net Mvc 2,C# 4.0,我试图重用一些现有模型(尤其是与它们相关联的加载/保存函数),因此我将它们聚合到当前模型中: public class EditModel { public SubModel1 {get; set; } public SubModel2 {get; set; } /* ID and some text fields */ } 问题是,在我填写表单并点击submit之后,在与POST相关联的操作中,这些子模型都有默认/空内容 /// POST for Edit [
public class EditModel {
public SubModel1 {get; set; }
public SubModel2 {get; set; }
/* ID and some text fields */
}
问题是,在我填写表单并点击submit之后,在与POST相关联的操作中,这些子模型都有默认/空内容
/// 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操作来正确构建模型。但现在我被限制在ascx上,因为我试图在模式对话框中进行编辑(如果有办法在div中加载一个aspx,那么这个问题就结束了;但我觉得这与aspx的用途相反。)
简而言之,这就是我要做的;我还将添加我尝试应用的两种策略,它们都具有相同的效果:空子模型
第一次尝试使用AJAX调用填充Edit.ascx。
在Edit.ascx
中,Manage.aspx中包含了用于编辑对话框的包装器,并且在没有任何初始化的情况下传递了EditModel
<div id="editDialog" style="display: none;">
<% Html.RenderPartial("Edit", new EditModel()); %>
</div>
第二次尝试尝试绕过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
});
}
}
不用说,
Edit.ascx
中的表单具有类似m.SubModel1.EditProfile)%%>
的字段,因此这不是问题的根源。尝试查看我在这个问题上的答案,看看这是否有帮助:这篇文章及其依赖项都非常有趣;不幸的是,它不适用于我的情况:我的索引等价物(Basket)是ShowEdit(stringcommunityid,stringexternalid)
;ModelState只包含这两个值,因此没有什么需要清除的(此外,它们是用于Edit.ascx目的的常量,因此它们实际上很有用)。但它确实向我指出了一个有趣的事实:在editcomunity(editcommutymodel模型)
中,ModelState只包含Id和非子模型字段;在ModelState[“SubModel1\u EditProfile”]
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');
}
<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
});
}
}
function ShowRes(ret) {
//...
$("#editDialog_Content").html(ret);
//Show Dialog
}