Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何在模型中重用类而不对所有类进行验证_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

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更好,除非您有特定的反对理由。

我决定不使用很多视图模型

这是我的实现


线程看起来与您试图实现的目标非常接近。您可以将注释移动到元数据类型(请参阅),但我怀疑这需要将所有数据注释都放在元数据类型上。