我在模型类中有两个属性:
public int? IntTest { get; set; }
public decimal? DecimalTest { get; set; }
然后使用以下哪个进行渲染:
@Html.EditorFor(model => model.IntTest, new { htmlAttributes = new { @class = "form-control"} })
@Html.EditorFor(model => model.DecimalTest, new { htmlAttributes = new { @class = "form-control"} })
我希望它们都能呈现为数字类型的html输入,但十进制不是,我得到:
<input class="form-control text-box single-line" data-val="true" data-val-number="The field IntTest must be a number." id="IntTest" name="IntTest" type="number" value="" />
<input class="form-control text-box single-line" data-val="true" data-val-number="The field IntTest must be a number." id="DecimalTest" name="DecimalTest" type="text" value="" />
十进制值呈现为type="text"
,而int注册为type="number"
。
This question暗示这不是预期的行为,所以我做错了吗?
如果这是预期的行为,是否可以更改EditorFor
以将所有小数呈现为type="number"
,而不必在type = "number"
的{{1}}中添加htmlAttributes
每个小数位?
答案 0 :(得分:1)
您看到的html是默认行为。 EditorFor()
方法使用TemplateHelpers.cs中定义的默认模板(除非您为类型创建了自定义EditorTemplate
)。
对于typeof int
(以及byte
和long
),它使用NumberInputTemplate
;对于typeof decimal
,它使用DecimalTemplate
。这些模板在DefaultEditorTemplates.cs中定义,用于decimal
internal static string DecimalTemplate(HtmlHelper html)
{
if (html.ViewContext.ViewData.TemplateInfo.FormattedModelValue == html.ViewContext.ViewData.ModelMetadata.Model)
{
html.ViewContext.ViewData.TemplateInfo.FormattedModelValue = String.Format(CultureInfo.CurrentCulture, "{0:0.00}", html.ViewContext.ViewData.ModelMetadata.Model);
}
return StringTemplate(html);
}
依次调用
internal static string StringTemplate(HtmlHelper html)
{
return HtmlInputTemplateHelper(html);
}
和int
internal static string NumberInputTemplate(HtmlHelper html)
{
return HtmlInputTemplateHelper(html, inputType: "number");
}
请注意,NumberInputTemplate
将inputType
定义为"number"
,从而添加了type="number"
属性,而StringTemplate
使用了默认的inputType
生成type="text"
。
要为type="number"
添加decimal
,则需要使用任一方法手动添加属性
@Html.EditorFor(m => m.DecimalTest, new { htmlAttributes = new { type = "number", @class = "form-control"} })
或
@Html.TextBoxFor(m => m.DecimalTest, new { type = "number", @class = "form-control"})
一种替代方法是在EditorTemplate
中为typeof /Views/Shared/EditorTemplates/Decimal.cshtml
创建自定义decimal
@model decimal?
@{
var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
if (!attributes.ContainsKey("type"))
{
attributes.Add("type", "number");
}
string formatString = ViewData.ModelMetadata.DisplayFormatString ?? "{0:N2}";
}
@Html.TextBoxFor(m => m, formatString , attributes)
并在主视图中使用
@Html.EditorFor(model => model.DecimalTest, new { htmlAttributes = new { @class = "form-control"} })
另一种选择是创建您自己的HtmlHelper
扩展方法(例如@Html.DecimalFor(...)
)来生成html。