对模型中相同的复杂属性类型应用不同的验证规则

本文关键字:应用 规则 验证 类型 复杂 模型 属性 | 更新日期: 2023-09-27 18:01:18

这句话到现在应该提过无数次了,但是我似乎找不到任何我喜欢的坚实的东西。

,请考虑

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Position { get; set; }
}

在视图模型中出现两次

public class MyViewModel
{
    public Person MainContact { get; set; }
    public Person AltContact { get; set; }
}

总是需要主联系人。不需要替代联系人,但是如果输入了任何内容,则应该验证该输入。如果我有两个不同的Contact类,它们将被这样描述:

public class MainContact
{
    [Required]
    [StringLength(50)]
    string FirstName { get; set; }
    [Required]
    [StringLength(50)]
    string LastName { get; set; }
    string Position { get; set; }
}
public class AltContact
{
    [StringLength(50)]
    string FirstName { get; set; }
    [StringLength(50)]
    string LastName { get; set; }
    string Position { get; set; }
}

但是,我不想有两个不同的Contact类具有完全相同的属性。

我希望一组验证应用于Person类的一个实例,另一组验证应用于同一Person类的不同实例。该解决方案还必须与客户端验证一起工作,并打开不引人注目的js。

UPDATE 1:添加字符串Position到Person和Contact类。

UPDATE 2:谢谢大家的意见。考虑到时间限制和旧的UI需求,我最终拥有了2个独立的类。然而,我个人喜欢Erik Funkenbusch在下面评论中的替代方法。如果我在未来遇到类似的情况,我将按下对象列表和"添加新Bla"按钮解决方案。我认为这是正确的选择。

对模型中相同的复杂属性类型应用不同的验证规则

由于Null属性答案似乎不适合您,因此我建议使用以下模型:

 public class MainContact: BaseContact
    {
        [Required]
        [StringLength(50)]
        public override string FirstName { get; set; }
        [Required]
        [StringLength(50)]
        public override string LastName { get; set; }
    }
    public class BaseContact
    {
        [StringLength(50)]
        public virtual string FirstName { get; set; }
        [StringLength(50)]
        public virtual string LastName { get; set; }
        string Position { get; set; }
    }

,然后使MainModel如下:

public class MyViewModel
{
    [Required]
    public MainContact MainContact { get; set; }
    public BaseContact AltContact { get; set; }
}

您仍然需要两个不同的模型,但是您可以通过继承获得共享公共元素的好处。