web-dev-qa-db-fra.com

Comment forcer Razor à obliger Editorfor à saisir le type de numéro de variable float

Voici mon code dans MVC 5:

@Html.EditorFor(model => model.myfloatvalue, new { @type = "number", @min = "0", @step = "0.01", @value = "0" })

Et voici le code 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="">

Pas à 

<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">

Que devrais-je faire?
Merci pour la réponse!

24
user3511843

Avez-vous essayé d'encapsuler votre objet anonyme dans la htmlAttributes d'un autre objet anonyme? Lors de l'utilisation de EditorFor/TextBoxFor, je crois que MVC 5 est le seul moyen d'affecter les attributs HTML générés par l'éditeur.

@Html.EditorFor(model => model.myfloatvalue, new { htmlAttributes = new { @type = "number", @min = "0", @step = "0.01", @value = "0" }})

Si vous n'utilisez pas MVC-5.1 ou une version ultérieure, vous devrez utiliser TextBoxFor(). Remarque: non htmlAttributes utilisé ici:

@Html.TextBoxFor(m => m.myfloatvalue, new { type = "number", min = "0", step = "0.01" }) // don't set the value attribute
36
Slicksim

En réalité, vous pouvez modifier le comportement par défaut de EditorFor pour float afin qu’il produise type="number" au lieu de type="text".

Pour ce faire, vous devez ajouter une EditorTemplate personnalisée pour le type Single (pasfloat) à /Views/Shared/EditorTemplates/Single.cshtml comme suit:

@model Single?

@{
    var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
    if (!attributes.ContainsKey("type")) { attributes.Add("type", "number"); }
}
@Html.TextBoxFor(m => m, attributes)

Cela fonctionne parce que float est un alias C # pour System.Single (voir le Référence du langage Microsoft c # pour plus de détails à ce sujet). Ajouter une EditorTemplate appelée Float.cshtml ne fonctionnera pas (j'ai essayé ...).

J'ai eu l'idée de cela grâce à l'excellente réponse de @ Stephen Muecke _ à ma question ici . Il mentionne également l'idée de créer votre propre extension HtmlHelper afin que vous puissiez ensuite écrire @Html.FloatFor(...).

Cette même approche peut également être appliquée à Decimal et Double, qui rendent également type="text" par défaut.

0
tomRedox