web-dev-qa-db-ja.com

RazorにEditorforがfloat変数の数値型を入力するように強制するにはどうすればよいですか?

MVC 5のコードは次のとおりです。

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

そして、これが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="">

しない

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

私は何をすべきか?
ご連絡ありがとうございます!

29
user3511843

匿名オブジェクトを別の匿名オブジェクトのhtmlAttributesでラップしようとしましたか? EditorFor/TextBoxForを使用する場合、MVC 5がエディターによるHTML属性出力に影響を与える唯一の方法であると考えています。

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

MVC-5.1以降を使用していない場合は、TextBoxFor()を使用する必要があります。ここではhtmlAttributesを使用しないことに注意してください。

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

floatのEditorForのデフォルトの動作を実際に変更して、_type="number"_の代わりに_type="text"_を生成することができます。

そのためには、EditorTemplateにカスタムSingleを追加する必要があります(notfloat)次のように_/Views/Shared/EditorTemplates/Single.cshtml_と入力します。

_@model Single?

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

これが機能する理由は、floatが_System.Single_のC#エイリアスであるためです(詳細については Microsoft c#言語リファレンス を参照してください)。 Float.cshtmlというEditorTemplateを追加しても機能しません(試しました...)。

これについては、@ Stephen Muecke の優れた回答 ここでの私の質問 からアイデアを得ました。また、独自のHtmlHelper拡張を作成して、@Html.FloatFor(...)を記述できるようにするというアイデアについても言及しています。

この同じアプローチは、DecimalDoubleにも適用できます。どちらもデフォルトで_type="text"_をレンダリングします。

0
tomRedox