【问题标题】:ASP.NET MVC ValidationAttribute causes invalid client side validation rulesASP.NET MVC ValidationAttribute 导致无效的客户端验证规则
【发布时间】:2015-09-17 00:05:43
【问题描述】:

我正在开发一个 ASP.NET MVC 5 应用程序。我正在使用属性来验证我的模型(后端和前端)。

我的一个模型有一个如下所示的属性:

[Required( ... )]
[Range( 0d, Double.MaxValue, ...)]
public Decimal Amount { get; set; }

0Double.MaxValue 的所有值都可以作为金额。 (这在后端完美运行)

在我的 UI 中,我有一个此模型的表单:

@using (Html.BeginForm(null, null, FormMethod.Post))
{
    @* Anti Forgery Token *@
    @Html.AntiForgeryToken()
    <fieldset>
        ...
        <section>
            @Html.LabelFor(model => model.Amount, new { @class = "label" })
            <label class="input">
                @Html.EditorFor(model => model.Amount, new { htmlAttributes = new { placeholder = Resources.Amount } })
                @Html.RenderCombinedValidationMessages(x => x.Amount, false)
            </label>
        </section>
    </fieldset>
    @Html.RenderGlobalValidationMessages()
    <footer>
        <div class="btn-group">
            <a href="@Html.GetPreviousPage( Url.Action( "Index", "Controller" ) )" class="btn btn-default">@Resources.Back</a>
            <button type="submit" class="btn btn-primary">@Resources.Create</button>
        </div>
    </footer>
}

此代码创建的 HTML 如下所示:

<form action="/Controller/Create" class="smart-form" method="post" novalidate="novalidate">
    <fieldset>                                               
        <section>
            <label class="label" for="Amount">Amount</label>
            <label class="input">
                <input 
                    data-val="true" data-val-number="The field Amount must be a number." 
                    data-val-range="Amount must be between 0 and 1.79769313486232E+308." 
                    data-val-range-max="1.79769313486232E+308" 
                    data-val-range-min="0" 
                    data-val-required="Amount is required."
                    id="Amount" name="Amount" placeholder="Amount" type="text" value="">                
                <ul class="validationMessageList" data-property-name="Amount"></ul><span class="field-validation-valid" data-valmsg-for="Amount" data-valmsg-replace="true"></span>
            </label>
        </section>
    </fieldset>
    <footer>
        <div class="btn-group">
            <a href="http://localhost:26165/Controller/Create" class="btn btn-default">Back</a>
            <button type="submit" class="btn btn-primary">Create</button>
        </div>
    </footer>
</form>

现在的问题:

基于验证属性,HtmlHelper 为最大范围创建 jQuery 验证规则:data-val-range-max="1.79769313486232E+308"。这导致 jQuery validate 只允许从 0 到 1.79 的值……。 (小于 2 的值)

我该如何解决这个问题?

【问题讨论】:

    标签: jquery asp.net-mvc jquery-validate data-annotations unobtrusive-validation


    【解决方案1】:

    我知道的一种方法是:

          [Range(typeof(decimal), "0", "79228162514264337593543950335")]
          public decimal Amount { get; set; }
    

    Meh-ish,但这是一个真正的交易。

    十进制 MaxValue 为 79228162514264337593543950335。https://msdn.microsoft.com/en-us/library/system.decimal.maxvalue(v=vs.110).aspx

    【讨论】:

    • 兄弟' 这会起作用。小数介于 -79,228,162,514,264,337,593,543,950,335 和 79,228,162,514,264,337,593,543,950,335 之间。您想要 > 0 个值。这将起作用。 1000%
    • 这就是为什么我在那里评论十进制 MaxValue。 Double.MaxValue 与您要实现的目标有什么关系?
    • 对不起,你是对的。我再次测试它并且它工作......(我在之前的测试中犯了一个愚蠢的错误,我使用了 d(Double)而不是 M(Decimal)......这导致了溢出异常)
    • 太棒了。如果您还有其他问题,请更新您的要求。
    猜你喜欢
    • 2015-11-29
    • 2010-09-14
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多