对模型中相同的复杂属性类型应用不同的验证规则
本文关键字:应用 规则 验证 类型 复杂 模型 属性 | 更新日期: 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; }
}
您仍然需要两个不同的模型,但是您可以通过继承获得共享公共元素的好处。