ASP.NET MVC - 如何使用必填字段实现可选的嵌套模型?

Rob*_*tra 5 c# asp.net-mvc-4

我目前正在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; }
}
Run Code Online (Sandbox Code Playgroud)

我认为这个模型定义本身就说明了一点:我能够将'PersonalData'类的属性声明为'Required',而且我也能够在'AddressData'模型上做同样的事情.这种方法适用于'ResidentialAddress'属性,但是使用可选的嵌套模型(例如'PostalAddress'属性中提供的模型)会变得棘手.

简单的说:

  • ' PersonalData '模型上的所有字符串属性都是必需的;
  • 存储在' ResidentialAddress '属性中的' AddressData '对象上的所有字符串属性都是必需的;
  • " 的PostalAddress "是可选的:的"所有字符串属性AddressData存储在'’-object 的PostalAddress ' -特性是必需的,如果一个’ AddressData " -instance指定给它.

"扁平化"PersonalData模型对我来说似乎不是一个理想的解决方案,特别是考虑到我们使用的是EditorTemplate.

我有什么选择?我在基础层面上做错了吗?是否有普遍支持的技术?

Rob*_*tra 2

我实际上找到了适合我需要的解决方案!假设控制器有这个方法:

[HttpPost]
public ActionResult Edit(PersonalData model)
{
    if (ModelState.IsValid)
    {
        // Success
        return Redirect("NextAction");
    }
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

此处“模型”参数中使用的“ PersonalData ”对象的实例化基于所发送的 POST 变量的反序列化。

现在,如果发送以下 POST 变量:

  • 名字:“约翰”
  • 姓氏:“多伊”
  • 住宅地址.邮政编码:'1234AB'
  • 居住地址.城市:“我的城市”
  • 住宅地址.街道:“我的街道”
  • 住宅地址.HouseNumber : '123'

然后它将被序列化为“PersonalData”实例,必须为其上的“ResidentialAddress”属性分配有效的“AddressData”实例。(MVC 似乎会自动处理这个问题)。

与“PostalAddress”相关的 POST 变量的存在,如下......

  • 邮政地址.邮政编码:'1234AB'
  • 邮政地址.城市:“我的城市”
  • 邮政地址.街道:“我的街道”
  • 邮政地址.门牌号:'123'

...似乎控制序列化是否会导致“AddressData”实例到“PostalAddress”属性的实例化,这恰好涵盖了我想要的情况。

底线:保持对发送的 POST 变量的控制,你应该没问题!我希望这对任何人都有帮助;欢迎提出建议和/或意见!