使EditorFor将十进制值呈现为type =“ text”而不是type =“ number”

时间:2018-08-25 15:33:15

标签: razor asp.net-mvc-5 html-input editorformodel

我在模型类中有两个属性:

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每个小数位?

1 个答案:

答案 0 :(得分:1)

您看到的html是默认行为。 EditorFor()方法使用TemplateHelpers.cs中定义的默认模板(除非您为类型创建了自定义EditorTemplate)。

对于typeof int(以及bytelong),它使用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");
}

请注意,NumberInputTemplateinputType定义为"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。