ASP.NET MVC DataAnnotation 需要 3 个中的 1 个 属性

ASP.NET MVC DataAnnotation Required 1 from 3 property

我正在使用 ASP.NET MVC 创建一个项目。

我的模型 class 看起来像这样:

public class CaseInformation
{
    public int Id { get; set; }

    public string CaseNumber { get; set; }
    public string RitNumber { get; set; }
    public string ApilNumber { get; set; }

    public DateTime Date { get; set; }

    public double CaseInvolvedRevenue { get; set; }
    public string CaseShortDescription { get; set; }
    public string CaseUpdateStatus { get; set; }

    public CompanyDetails CompanyDetails { get; set; }
    public int CompanyDetailsId { get; set; }
}

此处CaseNumberRitNumberApilNumber只需要1个。我不能把 [Required] 放在所有的上面。我怎么做?请帮忙。

您可以向您的模型添加一个 IsValid() 函数 returns true/false 并将错误附加到 ModelState。

案例信息:

public class CaseInformation
{
    public int Id { get; set; }

    public string CaseNumber { get; set; }
    public string RitNumber { get; set; }
    public string ApilNumber { get; set; }

    public DateTime Date { get; set; }

    public double CaseInvolvedRevenue { get; set; }
    public string CaseShortDescription { get; set; }
    public string CaseUpdateStatus { get; set; }

    public CompanyDetails CompanyDetails { get; set; }
    public int CompanyDetailsId { get; set; }

    public bool IsValid(out IDictionary<string, string> errors)
    {
        errors = new Dictionary<string, string>();
        if (string.IsNullOrWhiteSpace(CaseNumber) && string.IsNullOrWhiteSpace(RitNumber) &&
            string.IsNullOrWhiteSpace(ApilNumber))
        {
            errors.Add("MyError", "At least one Case, Rit or Apil number is required.");
        }
        return errors.Count == 0;
    }
}

然后在你的控制器中:

public ActionResult Index(CaseInformation model)
{
    if (!model.IsValid(out var errors))
    {
        foreach (KeyValuePair<string, string> error in errors)
        {
            ModelState.AddModelError(error.Key, error.Value);
        }                
    }
    if (ModelState.IsValid)
    {
        // it worked
    }
    else
    {
        // must be errors
    }
    return View();
}

然后在您看来:

@Html.ValidationSummary(false, "Please fix the below and try again.")

一种方法是,您可以实现自己的验证属性,如下所示 -

public class CaseInfoRequiredAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var caseInfo = (CaseInformation) validationContext.ObjectInstance;
        if (string.IsNullOrEmpty(caseInfo.CaseNumber) &&
            string.IsNullOrEmpty(caseInfo.RitNumber) &&
            string.IsNullOrEmpty(caseInfo.ApilNumber))
        {
            return new ValidationResult("Either CaseNumber or RitNumber or ApilNumber is required.");
        }
        return ValidationResult.Success;        
    }
}

然后对任一字段使用自定义属性

public class CaseInformation
{
    public int Id { get; set; }

    [CaseInfoRequired]
    public string CaseNumber { get; set; }
    public string RitNumber { get; set; }
    public string ApilNumber { get; set; }

    public DateTime Date { get; set; }

    public double CaseInvolvedRevenue { get; set; }
    public string CaseShortDescription { get; set; }
    public string CaseUpdateStatus { get; set; }

    public CompanyDetails CompanyDetails { get; set; }
    public int CompanyDetailsId { get; set; }
}

您可以在 CaseInformation class 本身中实现 ​​IValidatableObject 接口。这是它的样子:

public class CaseInformation : IValidatableObject
{
    ...

    public IEnumerable<ValidationResult> Validate(ValidationContext ctx)
    {
        if (string.IsNullOrWhiteSpace(CaseNumber) &&
            string.IsNullOrWhiteSpace(RitNumber) &&
            string.IsNullOrWhiteSpace(ApilNumber))
        {
            yield return new ValidationResult("Your error message here.");
        }
    }
}

Validate(ValidationContext) 方法在执行模型验证时由框架调用。在这里,我们只是检查是否所有三个值都缺失,如果是,我们通过返回带有自定义错误消息的 ValidationResult 来发出错误信号。