我目前正在ASP.NET MVC4应用程序中实现表单,我似乎无法找到有关输入验证的良好且可维护的解决方案。给出以下(简化)模型:
public class PersonalData
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public AddressData ResidentialAddress { get { return residentialAddress; } }
private readonly AddressData residentialAddress = new AddressData();
public AddressData PostalAddress { get; set; }
}
public class AddressData
{
[Required]
public string ZipCode { get; set; }
[Required]
public string City { get; set; }
[Required]
public string Street { get; set; }
[Required]
public int HouseNumber { get; set; }
}
我认为这个模型定义本身就说明了一点:我能够将'PersonalData'类的属性声明为'Required',而且我也能够在'AddressData'上做同样的事情 - 模型。这种方法适用于'ResidentialAddress'属性,但是使用可选的嵌套模型(例如'PostalAddress'属性中提供的模型)会很棘手。
简单地说:
'扁平化'PersonalData模型对我来说似乎不是一个理想的解决方案,特别是考虑到我们使用的是EditorTemplate。
我有什么选择?我在基础层面上做错了吗?是否有普遍支持的技术?
答案 0 :(得分:1)
我实际上找到了一个适合我需要的解决方案!假设一个控制器有这个方法:
[HttpPost]
public ActionResult Edit(PersonalData model)
{
if (ModelState.IsValid)
{
// Success
return Redirect("NextAction");
}
return View(model);
}
' PersonalData '的实例化 - 这里'model'参数中使用的对象是基于正在发送的POST变量的反序列化。
现在,如果发送了以下POST变量:
然后它将被序列化为'PersonalData'实例,在该实例上必须为'ResidentialAddress'属性分配一个有效的'AddressData'实例。 (MVC似乎自动处理这个问题)。
'PostalAddress'相关的POST变量的存在,如下......
...似乎控制序列化是否会导致'AddressData'实例实例化到'PostalAddress'属性,这恰好涵盖了我想要的情况。
底线:保持对正在发送的POST变量的控制,你应该没问题!我希望这可以帮助任何人;欢迎提出建议和/或意见!