0

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

假设我有 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))]onNameModel[MetadataType(typeof(IPhoneModel))]on PhoneModel

真正想做的是同时使用这两个接口,NamePhoneModel这样我就不必重新输入所有验证属性。请记住,这是一个简单的解决方案,现实世界的项目比这复杂得多 - 在上面的示例中,它很容易继承,但想想可能有其他属性NameModel不会存在于NamePhoneModel,或者更复杂的是,可能有一个电子邮件属性存在于NameModel另一个页面中,比如EmailModel

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

4

2 回答 2

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

通用视图模型:

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
    }
}
于 2013-08-07T05:53:45.547 回答
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();
    }
}
于 2013-08-07T11:26:20.873 回答