是否有任何普遍接受的方式来处理以下情况或我设计得不好?
我有一些域模型:
public class Person
{
public int ID {get;set;}
public string Name{get;set;}
public int? AddressID {get;set;}
}
public class Address
{
public int ID{get;set;}
public string Street {get;set;}
}
然后我有一个View Model:
public class Personnel
{
public Person Person{get;set;}
public Address Address{get;set;}
}
那么我对Personnel模型有一个强类型的视图,并说我有像这样的东西
@Html.HiddenFor(m => m.Address.ID)
@Html.EditorFor(m => m.Address.Street)
问题在于,当我获得Personnel模型时,有时Address可以为null,因为有时Person没有地址。但是UI要求仍然显示输入文本框。当Address为null时,视图中生成的标记如下:
<input value name="Address.AddressID" type="hidden">
我有一个控制器
[HttpPost]
public ActionResult EditPersonnel(Personnel model)
{
if (ModelState.IsValid)
{
model.Save() // or whatever
}
return View(model);
}
因此,当我回发到我的控制器时,Address.ID的表单集合中的值有一个空字符串。 ModelState始终无效,因为绑定程序无法将空字符串转换为int。 但我不想让它绑定,因为实际上没有任何地址(假设用户没有输入任何信息)。如何让绑定器忽略地址字段?
答案 0 :(得分:1)
实际上,如果视图需要model属性,Address
属性永远不应该是null
。如果Person.AddressID
为null
,请将Address
的“空”实例分配给Personnel.Address
媒体资源:
// assuming you have a data object named "person"
if(!person.AddressID.HasValue) // or use person.AddressID == null
{
model.Address = new Address(); // assuming your view model is called "model"
}
答案 1 :(得分:0)
试
[HttpPost]
public ActionResult EditPersonnel(Personnel model)
{
if(model.Address.Equals(null))
model.Address = new Address();
if (ModelState.IsValid)
{
model.Save() // or whatever
}
return View(model);
}