对于必需的ASP .NET MVC 3不显眼的验证失败

时间:2013-09-16 13:40:25

标签: asp.net-mvc-3 jquery-validate

我正在努力使用ASP .NET MVC 3不引人注目的验证。我的简单模型包含此字段:

[Display(Name = "Starting Amount")]
[Required(ErrorMessage = "Starting Amount is required.")]
public decimal? StartAmount { get; set; }

我正在使用一些自动格式化货币和数字的jQuery插件,因此StartAmount字段以美元符号($)为前缀。这个字段的客户端验证应该摆脱这个美元符号,所以我扩展了jQuery验证器:

$.validator.methods.number = function (value, element) {
        return true;
    }

这解决了美元符号的问题,但现在验证对于必需规则失败。当输入字段为空时,没有“需要启动金额字段”。消息显示。我有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

不要对jQuery验证器进行任何更改。您需要做的是为decimal类型定义一个自定义模型绑定器,如下所示:

public class DecimalModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        ValueProviderResult valueResult = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        object actualValue = null;

        if (valueResult != null && !string.IsNullOrEmpty(valueResult.AttemptedValue))
        {
            try
            {
                actualValue = decimal.Parse(valueResult.AttemptedValue, NumberStyles.Currency, CultureInfo.CurrentCulture);
            }
            catch (FormatException e)
            {
                modelState.Errors.Add(e);
            }

            bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        }

        return actualValue;
    }
}

然后,在Application_Start的{​​{1}}事件中,注册您的自定义模型绑定器,如下所示:

Global.asax

您可以在此处详细了解NumberStyles: NumberStyles Enumeration