如何强制 Razor 使 Editorfor 为浮点变量输入数字类型?

Posted

技术标签:

【中文标题】如何强制 Razor 使 Editorfor 为浮点变量输入数字类型?【英文标题】:How to force Razor to make Editorfor to input number type for float variable? 【发布时间】:2016-02-18 17:49:24 【问题描述】:

这是我在 MVC 5 中的代码:

@html.EditorFor(model => model.myfloatvalue, new  @type = "number", @min = "0", @step = "0.01", @value = "0" )

这里是html代码:

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

不要

<input class="text-box single-line" data-val="true" data-val-number="The field Fix Amount must be a number." data-val-required="The Fix Amount field is required." id="myfloatvalue" name="myfloatvalue" type="number" min="0" step="0.01" value="0">

我该怎么办? 感谢回复!

【问题讨论】:

您不能以这种方式将 html 属性添加到 EditorFor()(除非您使用 MVC-5.1 或更高版本,否则根本不会)。将其更改为@Html.TextBoxFor(m =&gt; m.myfloatvalue, new type = "number, min = 0, .... ) 但是当我点击提交按钮时 TextBoxFor 返回 null。 什么意思? @TextBoxFor() 方法渲染 &lt;input type="text" ../&gt;@EditorFor() 完全一样(除非您可以添加 html 属性) 是的,你是对的。如果我将当前模型发布为模型模式,它就可以工作。我正在发布一对一的输入。 Slicsim 添加了一个答案,假设您使用的是 MVC-5.1(显示正确的语法),所以我将编辑该答案以便您接受它。 【参考方案1】:

您是否尝试将匿名对象包装在另一个匿名对象的htmlAttributes 中?在使用EditorFor/TextBoxFor时,我相信MVC 5是影响编辑器输出HTML属性的唯一方法。

@Html.EditorFor(model => model.myfloatvalue, new  htmlAttributes = new  @type = "number", @min = "0", @step = "0.01", @value = "0" )

如果您不使用 MVC-5.1 或更高版本,则需要使用 TextBoxFor()。 注意这里没有使用htmlAttributes

@Html.TextBoxFor(m => m.myfloatvalue, new  type = "number", min = "0", step = "0.01" ) // don't set the value attribute

【讨论】:

mvc 5.1 中增加了对 htmlAttributes 的支持,你运行的是什么版本? DLL版本为4.0.0.0 如果您在 web.config 中查看 System.Web.Mvc 的程序集重定向,该 dll 重定向到哪个版本?在我的 5.2.2.0.上面的代码适用于该版本。您可能需要将您的项目升级到更高版本的 mvc,或者切换回 textboxfor,或者尝试在您的模型上使用 UiHint 属性 这似乎在 IE 中不起作用,但对 chrome 非常有用 你在第二个例子中有一个重复的大括号【参考方案2】:

您实际上可以为 float 更改 EditorFor 的默认行为,以便它生成 type="number" 而不是 type="text"

为此,您需要为Singlenot float)类型添加自定义EditorTemplate,如下所示:

@model Single?

@
    var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
    if (!attributes.ContainsKey("type"))  attributes.Add("type", "number"); 

@Html.TextBoxFor(m => m, attributes)

之所以有效,是因为floatSystem.Single 的C# 别名(有关详细信息,请参阅Microsoft c# Language Reference)。添加一个名为 Float.cshtml 的 EditorTemplate 将不起作用(我尝试过...)。

我从@Stephen Muecke 的出色回答to my question here 中得到了这个想法。他还提到了创建自己的HtmlHelper 扩展的想法,这样你就可以编写@Html.FloatFor(...)

同样的方法也可以应用于DecimalDouble,默认情况下这两个也渲染type="text"

【讨论】:

以上是关于如何强制 Razor 使 Editorfor 为浮点变量输入数字类型?的主要内容,如果未能解决你的问题,请参考以下文章

MVC 和 Razor 中 Html.TextboxFor 和 Html.EditorFor 的区别

MVC 在 EditorFor 中渲染局部视图

ASP.NET MVC3 - 带有@Html.EditorFor 的文本区域

Razor 如何创建一个 CheckBox 并使其成为 READONLY?

当前日期和时间 - MVC razor 中的默认值

如何使字形图标成为 Razor 中的 ajax 链接文本?