Faire EditorFor rendu valeur décimale type="text" pas type="nombre"
j'ai deux propriétés dans une classe de modèle:
public int? IntTest { get; set; }
public decimal? DecimalTest { get; set; }
que je rends ensuite avec:
@Html.EditorFor(model => model.IntTest, new { htmlAttributes = new { @class = "form-control"} })
@Html.EditorFor(model => model.DecimalTest, new { htmlAttributes = new { @class = "form-control"} })
Je m'attendais à ce que les deux rendent en tant qu'entrées html de type nombre, mais la décimale ne le fait pas, je reçois:
<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="" />
la valeur décimale est rendue par type="text"
alors que l'int est enregistré comme type="number"
.
cette question implique que ce n'est pas le comportement attendu alors est-ce que je fais quelque chose de mal?
si tel est le comportement attendu, est-il possible de changer EditorFor
pour rendre toutes les décimales type="number"
, plutôt que d'ajouter type = "number"
dans la htmlAttributes
de chaque zone décimale?
1 réponses
le html que vous voyez est le comportement par défaut. Les méthodes EditorFor()
utilisent les gabarits par défaut (à moins que vous ayez créé un custom EditorTemplate
pour le type) comme défini dans TemplateHelpers.cs .
pour le type de int
(et byte
et long
), il utilise le NumberInputTemplate
, et pour le type de decimal
il utilise le DecimalTemplate
. Ces gabarits sont définis dans DefaultEditorTemplates.cs qui sont pour 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);
}
qui à son tour appelle
internal static string StringTemplate(HtmlHelper html)
{
return HtmlInputTemplateHelper(html);
}
et pour int
internal static string NumberInputTemplate(HtmlHelper html)
{
return HtmlInputTemplateHelper(html, inputType: "number");
}
notez que le NumberInputTemplate
définit le inputType
comme "number"
qui ajoute l'attribut type="number"
, où comme StringTemplate
utilise la valeur par défaut inputType
qui génère type="text"
.
ajouter type="number"
pour un decimal
, puis vous devez ajouter manuellement l'attribut, soit
@Html.EditorFor(m => m.DecimalTest, new { htmlAttributes = new { type = "number", @class = "form-control"} })
ou
@Html.TextBoxFor(m => m.DecimalTest, new { type = "number", @class = "form-control"})
une alternative serait de créer une coutume EditorTemplate
dans le /Views/Shared/EditorTemplates/Decimal.cshtml
pour le type decimal
, par exemple
@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)
et dans la vue principale utilisation
@Html.EditorFor(model => model.DecimalTest, new { htmlAttributes = new { @class = "form-control"} })
une autre alternative serait de créer votre propre méthode d'extension HtmlHelper
(dites @Html.DecimalFor(...)
) pour générer le html.