質問

私は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; }
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top