【问题标题】:Set Required Field Validation based on condition in ASP.NET MVC根据 ASP.NET MVC 中的条件设置必填字段验证
【发布时间】:2018-01-31 16:05:27
【问题描述】:

我想在 ASP.NET MVC 中根据条件执行验证。

我有相同的页面和模型用于插入和更新记录,现在我想根据条件设置必填字段。

在插入时,EmployeeCode 是必需的,但在更新时我不想设置 EmployeeCode 是必需的。

如何在 asp.net mvc 中执行类似这种情况的验证?

【问题讨论】:

  • 你使用不同的控制器吗?
  • 使用不同的视图模型,或者你需要一个条件验证属性(例如foolproof[RequiredIf]属性)
  • 我使用的是同一个控制器
  • 我不知道如何使用RequiredIf。你能帮我吗

标签: asp.net asp.net-mvc validation asp.net-mvc-4 data-annotations


【解决方案1】:

您可以通过在 ViewModel 上实现 IValidatableObject 来添加自定义验证逻辑。

public class MyViewModelThatMixesTwoUsecases : IValidatableObject {
    public string EmployeeCode { get; set; }
    public bool IsCreateUsecase { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
        if (IsCreateUsecase && string.IsNullOrWhiteSpace(EmployeeCode)) {
            yield return new ValidationResult(
                "EmployeeCode is required for create usecase", 
                new[] {"EmployeeCode"}
            );
        }
    }
}

在控制器中,调用ModelState.IsValid测试你的模型是否有效。

【讨论】:

    【解决方案2】:

    您也可以使用 Fluent 验证。

    RuleFor(x => x.EmployeeCode)
               .Must((o,e) =>
               {
                   if (o.Id > 0)
                   {
                       return true;
                   }
                   return !string.IsNullOrEmpty(o.EmployeeCode);
               })
               .WithMessage("Employee code is required");
    

    您也可以使用 Dataannotation 验证来实现此目的。让我知道您正在使用哪个库以及版本。

    【讨论】:

    • 我正在使用 DataAnnotation 验证
    【解决方案3】:

    使用CustomeValidationAttribute

    首先,使用[CustomValidationAttribute] 装饰您的属性,并指定验证方法。例如

    [CustomValidation(typeof(YourModel), nameof(ValidateEmployeeCode))]
    public string EmployeeCode { get; set; }
    

    ValidateEmployeeCode 必须是public、static、返回ValidationResult,并接受一个对象作为第一个参数,或者是被验证属性的具体类型。它还可以接受ValidationContext 作为第二个参数,它具有有用的属性,例如正在验证的实例和属性的显示名称。

    然后该方法根据条件检查该值是否为空,并返回带有错误消息的ValidationResult.Success 或新ValidationResult,通过Html.ValidationMessageFor() 调用向用户显示风景。您可以使用记录 ID 的值作为标志来判断它是新记录还是更新记录。

    【讨论】:

    • 你能给我演示一下吗?
    • @Vish,我已经展示了如何装饰已验证的属性。验证方法如下:public static ValidationResult ValidateEmployeeCode(string value, ValidationContext context) { ValidationResult result = ValidationResult.Success; if (value &lt;&gt; [valid value]) { result = new ValidationResult("Employee Code is not valid."); } return result; }ValidationResult.Success以外的任何值(实际上是null)都会在MVC的验证机制中触发验证错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多