如何强制 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 => m.myfloatvalue, new type = "number, min = 0, .... )
但是当我点击提交按钮时 TextBoxFor 返回 null。
什么意思? @TextBoxFor()
方法渲染 <input type="text" ../>
与 @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"
。
为此,您需要为Single
(not float
)类型添加自定义EditorTemplate
,如下所示:
@model Single?
@
var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
if (!attributes.ContainsKey("type")) attributes.Add("type", "number");
@Html.TextBoxFor(m => m, attributes)
之所以有效,是因为float
是System.Single
的C# 别名(有关详细信息,请参阅Microsoft c# Language Reference)。添加一个名为 Float.cshtml 的 EditorTemplate
将不起作用(我尝试过...)。
我从@Stephen Muecke 的出色回答to my question here 中得到了这个想法。他还提到了创建自己的HtmlHelper
扩展的想法,这样你就可以编写@Html.FloatFor(...)
。
同样的方法也可以应用于Decimal
和Double
,默认情况下这两个也渲染type="text"
。
【讨论】:
以上是关于如何强制 Razor 使 Editorfor 为浮点变量输入数字类型?的主要内容,如果未能解决你的问题,请参考以下文章
MVC 和 Razor 中 Html.TextboxFor 和 Html.EditorFor 的区别
ASP.NET MVC3 - 带有@Html.EditorFor 的文本区域