在我开始之前,我想说我搜索过,发现没有类似的东西 在我的解决方案中,我有一个包含我的一些对象列表的模型
public class ModelView
{
public Owner owner = new Owner();
public Tenant tnt = new Tenant();
}
在我看来,我将这个类称为模型就是这样
@model WebApp.Models.ModelView
<form name="export_form" action="Export" method="post">
<table cellpadding="2" cellspacing="2" border="0">
@if (Condition_1)
{
<tr>
<td>
<!-- ID -->
</td>
<td>
@Html.HiddenFor(model => model.owner.ID)
</td>
</tr>
<tr>
<td>
Name
</td>
<td>
@Html.EditorFor(model => model.owner.name)
</td>
</tr>
<tr>
<td>
Phone
</td>
<td>
@Html.CheckBoxFor(model => model.owner.is_Checked_Phone)
</td>
</tr>
}
else
{
<tr>
<td>
<!-- ID -->
</td>
<td>
@Html.HiddenFor(model => model.tnt.ID)
</td>
</tr>
<tr>
<td>
Name
</td>
<td>
@Html.EditorFor(model => model.tnt.name)
</td>
</tr>
<tr>
<td>
Adress
</td>
<td>
@Html.CheckBoxFor(model => model.tnt.is_Checked_Adress)
</td>
</tr>
}
</table>
<input type="submit" name="SaveStuff" value="Save" />
<input type="submit" name="ExportStuff" value="Export" />
</form>
在我的控制器中,我有一个处理多个提交按钮的类,根据按钮名称,它会重定向到一个方法。以下是SaveStuff
方法
[HttpPost]
[SubmitButtonClass(Name = "SaveStuff")]
public ActionResult Save_Definition(Owner owner, Tenant tnt)
{
/*
Stuff Here
*/
}
这里的问题是即使实体不为空,我仍然会得到空值。有原因吗?没有返回任何值。
更新
模型A
public partial class Owner
{
public long ID { get; set; }
public bool is_Checked_Name { get; set; }
public bool is_Checked_Phone { get; set; }
}
模型B
public partial class Tenant
{
public long ID{ get; set; }
public bool is_Checked_Name { get; set; }
public bool is_Checked_Adress { get; set; }
}
这些是使用EF
自动生成的答案 0 :(得分:0)
您的代码存在多个问题。首先,视图中的模型为ModelView
,并生成前缀为该模型属性名称的表单控件,例如
<input type="checkbox" name="owner.is_Checked_Phone" ... />
这意味着您的POST方法需要与视图中的模型匹配
public ActionResult Save_Definition(ModelView model)
下一个问题是,您的模型只包含字段,而不是{ get; set; }
的属性,因此DefaultModelBinder
无法设置任何值。您的视图模型需要public Owner owner { get; set; }
等属性,并且在将模型传递给视图之前在控制器中设置值,或者在ModelView
的无参数构造函数中设置值。
但是,视图模型不应包含属于数据模型的属性,而应该是仅包含所需属性的平面结构。在你的情况下,它将是
public class ModelView
{
public long ID { get; set; }
[Display(Name = "Name")]
public bool IsNameSelected { get; set; }
[Display(Name = "Phone")]
public bool IsPhoneSelected { get; set; }
[Display(Name = "Address")]
public bool IsAddressSelected { get; set; }
// additional property to define if the form is for an Owner or Tenant
public bool IsOwner { get; set; }
}
和GET方法
var model = new ModelView()
{
IsOwner = true // or false
};
return View(model);
并在视图中
@model ModelView
....
@using (Html.BeginForm("Save_Definition"))
{
@Html.HiddenFor(m => m.ID)
@Html.HiddenFor(m => m.IsOwner)
@Html.CheckBoxFor(m => m.IsNameSelected )
@Html.LabelFor(m => m.IsNameSelected )
if (Model.IsOwner)
{
@Html.CheckBoxFor(m => m.IsPhoneSelected)
@Html.LabelFor(m => m.IsPhoneSelected)
}
else
{
@Html.CheckBoxFor(m => m.IsAddressSelected)
@Html.LabelFor(m => m.IsAddressSelected)
}
.... // submit buttons
}
以及POST方法,您可以查看model.IsOwner
的值,了解您是否已提交Owner
或Tenant
并采取相应措施。
附注:
<table>
元素用于表格数据。不要将它用于布局。<form action="Export" .. >
但您的POST方法是
名为Save_Definition
,因此不确定您打算采用哪种方法
将表格提交给。答案 1 :(得分:0)
如果您的后控制器正在更改原始模型数据,则需要发出ModelState.Remove(“ propertyname”),然后发出model.propertyname =“ new value”,然后简单的return View(model)将更新更改的内容您已经发布的视图的价值。