1

我似乎无法找到一种方法来覆盖数字字段的 MVC 验证的默认行为。

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

模型(为您构建的默认 MVC 4,加上两个属性“Age”和“Date”):

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

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

除了这一点,我什么也做不了。我试过删除 ClientDataTypeModelValidatorProvider

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

以及所有提供者

ModelValidatorProviders.Providers.Clear();

没有任何成功。

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

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

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

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

在此先感谢或任何建议。

4

1 回答 1

1

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());
于 2013-10-29T11:58:28.813 回答