这看起来很简单,但我觉得框架不会让我做我想做的事。
假设我有3个页面 - 一个要求提供名字/姓氏,一个要求提供电话号码,另一个要求您编辑这两个页面:
public class NameModel
{
public string FName {get;set;}
public string LName {get;set;}
}
public class PhoneModel
{
public string Phone { get; set;}
}
public string NamePhoneModel
{
public string FName {get;set;}
public string LName {get;set;}
public string Phone {get;set;}
}
我目前如何验证这些模型是因为我有两个具有所有验证属性的接口INameModel
和IPhoneModel
。我在[MetadataType(typeof(INameModel))]
使用NameModel
,[MetadataType(typeof(IPhoneModel))]
使用PhoneModel
。
我真正想要做的是使用NamePhoneModel
上的两个界面,因此我不必重新输入所有验证属性。请记住,这是一个简单的解决方案,真实世界的项目要比这复杂得多 - 在上面的例子中,它很容易继承,但想想NameModel
上可能有额外的属性赢了NamePhoneModel
中不存在,或者为了变得更复杂,NameModel
和另一个页面中可能存在电子邮件属性,例如EmailModel
感觉只是简单地复制所有这些规则的正确方法 - 必须有更好/正确的方法吗?
答案 0 :(得分:1)
将它们设置为模型使用的类型,或者创建可以创建可重复使用的通用ViewModel,并在相应的操作中丢弃任何未使用的属性验证错误。 将它们设置为类型:
public class Name
{
public string First {get;set;}
public string Last {get;set;}
}
public class Phone
{
public string Number { get; set;}
}
public class NamePhoneModel
{
public Name Name {get;set;}
public Phone Phone {get;set;}
}
public class PhoneModel
{
public Phone Phone {get;set;}
}
public class NameModel
{
public Name Name {get;set;}
}
Generic ViewModel:
public class ViewModel
{
public string First {get;set;}
public string Last {get;set;}
public string Phone {get;set;}
}
[HttpPost]
public ActionResult EditPhone(ViewModel model)
{
ModelState["First"].Errors.Clear();
ModelState["Last"].Errors.Clear();
if (ModelState.IsValid)
{
// Validate Phone
}
}
[HttpPost]
public ActionResult EditName(ViewModel model)
{
ModelState["Phone"].Errors.Clear();
if (ModelState.IsValid)
{
// Validate Names
}
}
[HttpPost]
public ActionResult EditBoth(ViewModel model)
{
if (ModelState.IsValid)
{
// Validate All
}
}
答案 1 :(得分:0)
所以我必须使用的解决方案是在我的类中创建类:
public string NamePhoneModel : IValidationObject
{
[MetadataType(typeof(INameModel))]
public class NM : INameModel
{
public string FName {get;set;}
public string LName {get;set;}
}
[MetadataType(typeof(IPhoneModel))]
public class PM : IPhoneModel
{
public string Phone {get;set;}
}
public NM N { get; set; }
public PM P { get; set; }
public NamePhoneModel()
{
this.N = new NM();
this.P = new PM();
}
}