ASP.NET MVC 2 - HTML.EditorはNullable Typeの場合?
-
28-09-2020 - |
質問
私は2つのエディタテンプレートを持っています:10進数のためのもの、そして10進数は1つ?(nullable)
しかし私のモデルにヌル可能な小数点を持っているとき、それは通常の10進編集者をロードしようとします:
<%: Html.EditorFor(model => model.SomeDecimal )%>
<%: Html.EditorFor(model => model.SomeNullableDecimal )%>
.
最初のワークは正常に動作し、10進エディタのテンプレートをロードします。2番目のものはまた、10進数のテンプレートをロードしようとします(そしてそれは10進数フィールドではないために失敗します)。
エラーメッセージは次のとおりです。
The model item passed into the dictionary is null, but this dictionary requires
a non-null model item of type 'System.Decimal'.
.
私のテンプレートはこのように宣言されています:
10進テンプレート:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal>" %>
.
nullable 10進テンプレート:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal?>" %>
.
テンプレート名を渡すことでうまくいくことができること、例えば
しかし、私は本当に他のすべてのテンプレートのようにタイプを使うだけで自動的に動作することを好みます。
<%: Html.EditorFor(model => model.SomeNullableDecimal,
"NullableDecimalTemplate" )%>
. 解決
前向きな解決策を得るために賞金を追加するためのBryanに感謝していますが、答えが確実にないことを発見したと言うつもりです - あなたはから自動的に発見されたNULL可能なテンプレートを持つことはできませんそのタイプテンプレート名を使用する必要があります。
これは、Brad Wilsonのブログからの http://bradwilson.typepad.com/blog/2009/10/ASPNET-MVC-2-templates-part-3-default-templates.html 彼はMVCの信頼できる情報源ですので、彼が言うとき彼が彼を信じる必要がある:
型名を検索するときは、 単純な名前が使用されます(すなわち、type.name) 名前空間なしで。また、タイプの場合 nullable、t(SO)を検索します あなたはブールテンプレートを得るでしょう あなたが「ブール」を使っているかどうか "nullable")
彼はまた言うように続けています
これはあなたがテンプレートを書いているなら 値の種類については、必要になる必要があります 値があるかどうかを説明します nullableまたは違う。あなたはを使うことができます のisNullableValueTypeプロパティ ModelMetadata 値はヌル可能です。私たちはANを見ます 以下の例の例 組み込みブールテンプレート
そうはい、この質問に対する答えがありますが、残念ながら答えはいいえです。
NULL可能なテンプレートを使用するには、テンプレート名を説明する必要があります。
<%: Html.EditorFor(model => model.SomeNullableDecimal, "NullableDecimalTemplate" )%>
.
またはnullableと非nullable型の両方を処理する1つのテンプレートを使用できます。
<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
<%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
<%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>
. 他のヒント
NULL可能なタイプのテンプレートを作成するには、テンプレートに基本値の種類として名前を付けてから、NULL可能なモデルでエディタテンプレートを作成します。
たとえば、INTのテンプレートをやりたいですか。私は "int32.cshtml"という名前のエディタテンプレートを作成しました。モデルとして。
テンプレートは "NULLABLE`1"という名前の名前を付けなければなりません。これはnullable構造体に一致するので、モデルタイプのスイッチを実行し、 "nullable`1.ascx"
内からの型に基づいて適切な部分テンプレートをレンダリングすることができます。あなたが望む方法でそれをする方法はありません。10進数と10進数のテンプレートは1つだけですか。しかし、渡された値がこのようなnullable型の場合は、テンプレートで決定できます。
<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
<%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
<%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>
.
詳細については
はい、HTML.EditorForでテンプレートを指定せずにこれを行うことができますが、UIHINT属性を使用してNullableプロパティに対してテンプレートを指定する必要があります。
[UIHint("NullableDecimalTemplate")]
public decimal? SomeNullableDecimal { get; set; }
.