1

我正在努力使用 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;
    }

这解决了美元符号的问题,但现在需要规则的验证失败。当输入字段为空时,没有“起始金额字段为必填项”。显示的消息。任何想法我做错了什么?

4

1 回答 1

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情况下Global.asax,注册您的自定义模型绑定器,如下所示:

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());

您可以在此处阅读有关 NumberStyles 的更多信息: NumberStyles 枚举

于 2013-09-16T14:39:23.570 回答