【问题标题】:MVC3 Decimal field not validating properlyMVC3 十进制字段未正确验证
【发布时间】:2012-01-13 18:54:57
【问题描述】:

我看到了一些其他关于本地化的问题,但这似乎不是这里的问题。

我的 ViewModel 中有 2 个十进制字段

[DisplayName("Standard Hourly Rate")]
public decimal Rate { get; set; }

[Required]
[DisplayName("Daily Travel Rate")]
public decimal TravelRate { get; set; }

在我看来,我有这个:

<div class="editor-label">
    @Html.LabelFor(model => model.Rate)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Rate)
    @Html.ValidationMessageFor(model => model.Rate)
</div>

<div class="editor-label">
    @Html.LabelFor(model => model.TravelRate)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.TravelRate)
    @Html.ValidationMessageFor(model => model.TravelRate)
</div>

这看起来应该没问题,但是每当我提交表单时,都会收到验证错误。如果我提交任何带小数的数字,我被告知该值无效。如果我输入的不是数字,我会被告知它必须是数字。

编辑: HTML 输入如下所示

<input type="text" value="" name="Rate" id="Rate" data-val-required="The Standard Hourly Rate field is required." data-val-number="The field Standard Hourly Rate must be a number." data-val="true" class="text-box single-line">

<input type="text" value="" name="TravelRate" id="TravelRate" data-val-required="The Daily Travel Rate field is required." data-val-number="The field Daily Travel Rate must be a number." data-val="true" class="text-box single-line">

Edit2:控制器只检查 Modelstate.IsValid,然后将其添加到数据库中。

【问题讨论】:

  • 渲染的&lt;input 元素是什么样的?能否完整发布,包括 data-val 属性?
  • 我在其中添加了生成的输入。

标签: c# asp.net-mvc-3 validation decimal viewmodel


【解决方案1】:

我很惊讶您收到数字验证错误(除非您有一个单独的验证方法,但您没有显示)。除了 Required 注释之外,您的模型中的任何内容看起来都不会导致任何验证。无论如何,我建议您查看 DataAnnotationsExtensions 进行十进制验证:

http://dataannotationsextensions.org/Numeric/Create

然后你可以用[Numeric]装饰你的decimal

如果您的模型可以接受,您也可以尝试[DataType(DataType.Currency)]

你的模型上有验证方法吗?

编辑

尝试使用floatdouble 而不是decimal。我认为decimal 这个词可能具有欺骗性。在此处查看decimal 课程:http://msdn.microsoft.com/en-us/library/364x0z75(v=vs.80).aspx

它可能会解决一些问题。小数如下所示:

decimal myMoney = 300.5m;

【讨论】:

  • 不,我的模型中没有任何验证方法。
  • 看起来不错。那不是问题。尝试切换DataAnnotation 看看是否有任何变化。我不认为 MVC 会自动生成数字验证
  • 它在任何地方都找不到。虽然我相信它是自动生成的,因为我在模型中为该字段指定了显示名称,因此它必须在尝试验证时生成它。
  • 其实如果是这样的话,就会抛出异常。它期待 RatesViewModel;我很想将小数转换为字符串并添加 [Numeric] 但这似乎是在逃避问题。我还必须在将字符串插入数据库之前对其进行转换。
  • 是的,这绝对是一个奇怪的问题。尝试使用floatdouble 而不是decimal,看看你是否得到同样的疯狂行为。 decimal 类型可能具有欺骗性。
【解决方案2】:

好的,所以我的问题是被发布回控制器的模型为空。发生这种情况是因为它正在寻找的参数称为 rate 并且我的模型中还有一个名为 Rate 的属性。我刚刚在控制器中将 rate 重命名为 myrate ,现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2011-12-15
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多