将不同的验证规则应用于模型中的同一复杂属性类型

时间:2016-08-08 20:06:20

标签: c# asp.net-mvc asp.net-mvc-5

到现在这应该已经达到了一百万次,但我似乎无法找到任何我喜欢的东西。

请考虑

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; }
}

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

我希望将一组验证应用于Person类的一个实例,将另一组验证应用于同一Person类的不同实例。该解决方案还必须使用不显眼的js打开客户端验证。

更新1 :为人员和联系人类添加了字符串位置。

更新2 :谢谢大家的投入。考虑到时间限制和旧的UI要求,我最终得到了2个单独的类。但是,我个人喜欢以下评论中的Erik Funkenbusch的替代方法。如果我将来遇到类似的情况,我会推送对象列表和"添加新的Bla"按钮解决方案我认为这是最佳选择。

1 个答案:

答案 0 :(得分:0)

由于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; }
}

你仍然需要有两个不同的模型,但是你可以通过继承来共享共同的元素。