Asp.net mvc 如何在模型中重用类而不对所有类进行验证
我有通用的联系方式Asp.net mvc 如何在模型中重用类而不对所有类进行验证,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我有通用的联系方式 public class Contact { public string Title { get; set; } public string FirstName { get; set; } [Required(ErrorMessage = "Please enter LastName")] public string LastName { get; set; } [Required(ErrorMessage = "Please e
public class Contact
{
public string Title { get; set; }
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter LastName")]
public string LastName { get; set; }
[Required(ErrorMessage = "Please enter Email")]
public string Email { get; set; }
public string Phone { get; set; }
}
现在我想在两个模型中使用contact类,但只在第二个模型中应用验证
public class Step1Model{
public Contact Contact{get;set;}
}
public class Step2Model{
[Requried]
public Contact Contact{get;set;}
}
如何使其工作?我在这里看到两个选项: 1-接口的代码,该接口将要求您基于ContactInterface创建ContactRequired类和ContactOptional类。我相信这将允许您拥有一个StepModel,您可以在其中将StepModel.Contact属性设置为new ContactRequired()或new ContactOption()。然后,当为StepModel运行validaiton时,它将基于您为StepModel.Contact属性设置的类的类型
public interface ContactInterface
{
string Title { get; set; }
string FirstName { get; set; }
string LastName { get; set; }
string Email { get; set; }
string Phone { get; set; }
}
public class ContactOptional : ContactInterface
{
public string Title { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
}
public class ContactRequired : ContactInterface
{
public string Title { get; set; }
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter LastName")]
public string LastName { get; set; }
[Required(ErrorMessage = "Please enter Email")]
public string Email { get; set; }
public string Phone { get; set; }
}
public class StepModel
{
public ContactInterface Contact { get; set; }
}
用法:
StepModel smTest = new StepModel();
ContactRequired crContact = new ContactRequired();
ContactOptional coContact = new ContactOptional();
List<ValidationResult> lErrors = new List<ValidationResult>();
smTest.Contact = coContact;
//Validate Option
if (Validator.TryValidateObject(smTest, new ValidationContext(smTest, serviceProvider: null, items: null), lErrors, true))
{
//Code should reach this as the model should be valid;
}
smTest.Contact = crContact;
//Validate Required
if (Validator.TryValidateObject(smTest, new ValidationContext(smTest, serviceProvider: null, items: null), lErrors, true))
{
//Code should not reach this as the model should be invalid;
}
StepModel smTest=新的StepModel();
ContactRequired crContact=新ContactRequired();
ContactOptional coContact=新ContactOptional();
列表错误=新列表();
smTest.Contact=共触点;
//验证选项
if(Validator.TryValidateObject(smTest,新的ValidationContext(smTest,serviceProvider:null,items:null),lerror,true))
{
//代码应达到此值,因为模型应有效;
}
smTest.Contact=crContact;
//需要验证
if(Validator.TryValidateObject(smTest,新的ValidationContext(smTest,serviceProvider:null,items:null),lerror,true))
{
//代码不应达到此值,因为模型应无效;
}
2-创建一个自定义的required属性,该属性将查看联系人模型的另一个属性(例如bool UseValidation),以确定是否应该进行所需的验证,或者是否应该将true作为默认值返回。我最初并没有为这个选项提供代码,因为对于类中的每种类型的验证属性,您都需要一个自定义属性。此外,我认为选项1更好,除非您有特定的反对理由。我决定不使用很多视图模型 这是我的实现
线程看起来与您试图实现的目标非常接近。您可以将注释移动到元数据类型(请参阅),但我怀疑这需要将所有数据注释都放在元数据类型上。