在我开始之前,我想说的是,我没有发现任何类似的东西。
在我的解决方案中,我有一个模型,其中包含一些对象的列表。
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自动生成的。
发布于 2016-04-22 20:35:51
您的代码有多个问题。首先,视图中的模型是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
,因此不确定要将表单提交给哪个方法。发布于 2018-09-06 08:42:24
如果post控制器正在更改原始模型数据,则需要发出一个ModelState.Remove("propertyname"),后面跟着model.propertyname = "new“,然后简单的返回视图(模型)将在您已经发布的视图上更新已更改的值。
https://stackoverflow.com/questions/36806187
复制相似问题