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

通过使用上述模型布局,您正在重复使用现有的验证属性。