【问题标题】:ASP.NET MVC client side validation issue for range function范围函数的 ASP.NET MVC 客户端验证问题
【发布时间】:2016-02-16 17:16:21
【问题描述】:

我有一个 ASP.NET MVC5 应用程序,这是我的视图模型:

    [RegularExpression("[0-9]+(,[0-9]+)*"]
    [Range(1, double.MaxValue, ErrorMessage = "value is not correct")]
    [Required]
    [DisplayFormat(DataFormatString = "{0:0,0}", ApplyFormatInEditMode = true, HtmlEncode = true)]
    public double? Amount { get; set; }

我的看法:

<div class="col-sm-8">
     @Html.EditorFor(m => m.Amount, new { @class = "form-control font-num numbers", maxlength = "10" })
     @Html.ValidationMessageFor(m => m.Amount, "", new { @class = "text-danger" })
</div>

唯一值得注意的是,我在视图中每三位数使用逗号分隔符格式化数字。

例如:123456789 => 123,456,789

我知道我应该使用自定义模型绑定器进行服务器端验证,并覆盖 jquery.validate.js 文件中 range() 和 number() 函数的默认实现。

所以我做了如下:

public class DoubleModelBinder : IModelBinder
{
    /// <summary>
    /// Binds the value to the model.
    /// </summary>
    /// <param name="controllerContext">The current controller context.</param>
    /// <param name="bindingContext">The binding context.</param>
    /// <returns>The new model.</returns>
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var culture = GetUserCulture(controllerContext);

        string value = bindingContext.ValueProvider
                           .GetValue(bindingContext.ModelName)
                           .ConvertTo(typeof(string)) as string;

        double result = 0;
        double.TryParse(value, NumberStyles.Any, culture, out result);

        return result;
    }

    /// <summary>
    /// Gets the culture used for formatting, based on the user's input language.
    /// </summary>
    /// <param name="context">The controller context.</param>
    /// <returns>An instance of <see cref="CultureInfo" />.</returns>
    public CultureInfo GetUserCulture(ControllerContext context)
    {
        var request = context.HttpContext.Request;
        if (request.UserLanguages == null || request.UserLanguages.Length == 0)
            return CultureInfo.CurrentUICulture;

        return new CultureInfo(request.UserLanguages[0]);
    }
}

对于客户端验证:

$.validator.methods.range = function (value, element, param) {
var globalizedValue = value.replace(",", "");
return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]);}

$.validator.methods.number = function (value, element) {
return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);}

服务器端验证运行良好,但客户端验证无法正常工作,并且我总是收到“值不正确”错误验证。如果我忽略 [Range(1, double.MaxValue, ErrorMessage = "value is not correct")] 属性,效果很好,但用户可以为此字段输入零。我的客户端验证出了什么问题?

【问题讨论】:

    标签: jquery asp.net-mvc validation range client-side-validation


    【解决方案1】:

    花了很多时间和跟踪 range() 函数,最后我发现我应该使用:

    var globalizedValue = value.replace(new RegExp(",", "g"), "");
    

    而不是

    var globalizedValue = value.replace(",", "");
    

    因为我有多个逗号(例如:123,456,789)并且默认的 .replace() 行为是仅替换第一个匹配项。

    我的错误是我使用了this 博客中的解决方案,而我的问题不同。我每三位使用逗号作为分隔符,而不是小数分隔符。所以我有不止一个逗号,默认的 replace() 方法不合适。事实上,RegExp(",", "g") 会替换所有出现的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-14
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多