MVC 数字验证

本文关键字:验证 数字 MVC | 更新日期: 2023-09-27 18:37:21

我似乎无法覆盖数字字段的 MVC 验证的默认行为。

创建了一个默认的 MVC4 项目来表示我的问题。

模型(默认的 MVC 4 为您构造,加上两个属性"年龄"和"日期"):

    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }
    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }
    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
    public DateTime Date { get; set; }
    public int Age { get; set; }

因此,默认情况下,MVC 会验证我创建的两个字段,并且我收到以下验证消息:"字段"年龄"是必需的"和"字段"日期"是必需的"

现在我试图实现的是强制我的应用程序忽略默认的数字验证(我在客户端执行此操作,用户无法输入无效值)。我尝试强制 MVC 不为不可空的属性添加默认的"必需"属性:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

这给了我一些进步。现在它不执行"必需"验证,但发布表单会产生两条相同的验证消息:"值是必需的"。

除此之外,我什么也做不了。我尝试删除客户端数据类型模型验证器提供程序

        foreach (ModelValidatorProvider prov in ModelValidatorProviders.Providers)
        {
            if (prov.GetType().Equals(typeof(ClientDataTypeModelValidatorProvider)))
            {
                break;
            }
        }

以及所有提供商

ModelValidatorProviders.Providers.Clear();

没有任何成功。

我还尝试重载MVC在DataAnnotationsModelValidatorProvider中使用的一些默认属性,但是这没有给我任何结果。

因此,关于这种情况,我想问几个问题:

  1. 是否可以强制 MVC 不在服务器端对不可为空的数据类型进行默认验证?如果可能的话,如何?
  2. 是否可以更改问题 1 中描述的默认验证行为?如果可能的话 - 如何?
  3. 是否可以强制 MVC 使用我的自定义验证器/验证属性而不是此自定义属性?如果可能的话 - 如何?

另外需要注意的是:我不想编写为我进行验证的属性并将其放在它应该对其进行验证的每个属性上。我正在寻找一种解决方案,它将允许我定义有关如何进行默认验证的规则。

提前感谢或任何建议。

MVC 数字验证

int创建自己的模型绑定器。然后使该绑定器在出错时返回 0。

public class IntModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        ValueProviderResult valueResult = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        try
        {
            actualValue = Convert.ToInt32(valueResult.AttemptedValue,
                System.Globalization.CultureInfo.InvariantCulture);
        }
        catch (FormatException e)
        {
            //Uncomment for default error
            //modelState.Errors.Add(e);
            actualValue = 0;
        }
        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return actualValue;
    }
}

在Global.asax Application_Start()中:

ModelBinders.Binders.Add(typeof(int), new IntModelBinder());