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
demandé sur tomRedox 2018-08-25 18:33:14

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.

1
répondu Stephen Muecke 2018-08-27 06:22:11