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; }
}
此处CaseNumber
、RitNumber
、ApilNumber
只需要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
来发出错误信号。
我正在使用 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; }
}
此处CaseNumber
、RitNumber
、ApilNumber
只需要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
来发出错误信号。