继承多个元数据类型

时间:2013-08-07 05:44:08

标签: asp.net-mvc asp.net-mvc-3 model-validation

这看起来很简单,但我觉得框架不会让我做我想做的事。

假设我有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;}
}

我目前如何验证这些模型是因为我有两个具有所有验证属性的接口INameModelIPhoneModel。我在[MetadataType(typeof(INameModel))]使用NameModel[MetadataType(typeof(IPhoneModel))]使用PhoneModel

真正想要做的是使用NamePhoneModel上的两个界面,因此我不必重新输入所有验证属性。请记住,这是一个简单的解决方案,真实世界的项目要比这复杂得多 - 在上面的例子中,它很容易继承,但想想NameModel上可能有额外的属性赢了NamePhoneModel中不存在,或者为了变得更复杂,NameModel和另一个页面中可能存在电子邮件属性,例如EmailModel

感觉只是简单地复制所有这些规则的正确方法 - 必须有更好/正确的方法吗?

2 个答案:

答案 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();
    }
}