MVC 仅验证 2 个(或多个)模型中的 1 个模型
MVC Validate only 1 model from 2 (or multiple) models
现在,我的方案是我想验证 Contact 模型(次要)仅当 ContactID > 0 否则它将验证 Organization 模型仅(主要)。我不想为此编写自定义业务验证。
请建议我是否可以在带有数据注释的 MVC 结构中使用。我在另一个模型中引用了一个模型,如下所示
public class Organization
{
public Organization()
{
this.OrgStatus = "Active";
this.OrgContact = new Contact();
}
public int OrganizationID { get; set; }
[Required(ErrorMessage = "Organization Code is required")]
[MaxLength(25)]
public string OrgCode { get; set; }
[Required(ErrorMessage = "Status is required")]
[MaxLength(20)]
public string OrgStatus { get; set; }
public Contact OrgContact { get; set; }
}
public class Contact
{
public Contact()
{
this.Title = "Mr.";
}
[Required]
public int? ContactID { get; set; }
[Required(ErrorMessage = "Please enter Title", AllowEmptyStrings = false)]
[MaxLength(5)]
public string Title { get; set; }
[Required(ErrorMessage = "Please enter First Name", AllowEmptyStrings = false)]
[MaxLength(25)]
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter Middle Name", AllowEmptyStrings = false)]
[MaxLength(25)]
public string MiddleName { get; set; }
[Required(ErrorMessage = "Please enter Last Name", AllowEmptyStrings = false)]
[MaxLength(25)]
public string LastName { get; set; }
}
如果不使用自定义模型联编程序,就无法告诉 MVC 忽略嵌套模型(在您的情况下 Contact
)上的验证属性。 MVC 将自动执行任何嵌套模型的验证规则。
继承
如果问题是您想使用具有验证属性的 相同 视图模型,但嵌套的 Contact
属性 是仅适用于在某些页面上接收发布的值,那么您可以使用继承来创建一个包含 Contact
属性 和不包含的视图模型。
在此示例中,您可能有两种操作方法,一种接受具有 Contact
属性 的视图模型,另一种不接受。
// Example action methods
public ActionResult Page1(Organization requestModel)
{
...
}
public ActionResult Page2(OrganizationWithContact requestModel)
{
...
}
您可以从 Organization
模型中删除 Contact
属性 并利用继承来确保您有一个特定于发布 [=12= 的页面的模型] 值和一个不值。
public class Organization
{
public Organization()
{
this.OrgStatus = "Active";
this.OrgContact = new Contact();
}
public int OrganizationID { get; set; }
[Required(ErrorMessage = "Organization Code is required")]
[MaxLength(25)]
public string OrgCode { get; set; }
[Required(ErrorMessage = "Status is required")]
[MaxLength(20)]
public string OrgStatus { get; set; }
// No longer required here.
// public Contact OrgContact { get; set; }
}
// New model, using inheritence to include `Contact` model
public class OrganizationWithContact : Organization
{
public Contact OrgContact { get; set; }
}
通过使用上述模型布局,您正在重复使用现有的验证属性。
现在,我的方案是我想验证 Contact 模型(次要)仅当 ContactID > 0 否则它将验证 Organization 模型仅(主要)。我不想为此编写自定义业务验证。
请建议我是否可以在带有数据注释的 MVC 结构中使用。我在另一个模型中引用了一个模型,如下所示
public class Organization
{
public Organization()
{
this.OrgStatus = "Active";
this.OrgContact = new Contact();
}
public int OrganizationID { get; set; }
[Required(ErrorMessage = "Organization Code is required")]
[MaxLength(25)]
public string OrgCode { get; set; }
[Required(ErrorMessage = "Status is required")]
[MaxLength(20)]
public string OrgStatus { get; set; }
public Contact OrgContact { get; set; }
}
public class Contact
{
public Contact()
{
this.Title = "Mr.";
}
[Required]
public int? ContactID { get; set; }
[Required(ErrorMessage = "Please enter Title", AllowEmptyStrings = false)]
[MaxLength(5)]
public string Title { get; set; }
[Required(ErrorMessage = "Please enter First Name", AllowEmptyStrings = false)]
[MaxLength(25)]
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter Middle Name", AllowEmptyStrings = false)]
[MaxLength(25)]
public string MiddleName { get; set; }
[Required(ErrorMessage = "Please enter Last Name", AllowEmptyStrings = false)]
[MaxLength(25)]
public string LastName { get; set; }
}
如果不使用自定义模型联编程序,就无法告诉 MVC 忽略嵌套模型(在您的情况下 Contact
)上的验证属性。 MVC 将自动执行任何嵌套模型的验证规则。
继承
如果问题是您想使用具有验证属性的 相同 视图模型,但嵌套的 Contact
属性 是仅适用于在某些页面上接收发布的值,那么您可以使用继承来创建一个包含 Contact
属性 和不包含的视图模型。
在此示例中,您可能有两种操作方法,一种接受具有 Contact
属性 的视图模型,另一种不接受。
// Example action methods
public ActionResult Page1(Organization requestModel)
{
...
}
public ActionResult Page2(OrganizationWithContact requestModel)
{
...
}
您可以从 Organization
模型中删除 Contact
属性 并利用继承来确保您有一个特定于发布 [=12= 的页面的模型] 值和一个不值。
public class Organization
{
public Organization()
{
this.OrgStatus = "Active";
this.OrgContact = new Contact();
}
public int OrganizationID { get; set; }
[Required(ErrorMessage = "Organization Code is required")]
[MaxLength(25)]
public string OrgCode { get; set; }
[Required(ErrorMessage = "Status is required")]
[MaxLength(20)]
public string OrgStatus { get; set; }
// No longer required here.
// public Contact OrgContact { get; set; }
}
// New model, using inheritence to include `Contact` model
public class OrganizationWithContact : Organization
{
public Contact OrgContact { get; set; }
}
通过使用上述模型布局,您正在重复使用现有的验证属性。