12

2つのエディターテンプレートがあります。1つは10進数用で、もう1つは10進数用ですか。(null許容)

しかし、モデルにnull許容の小数がある場合、通常の小数エディターをロードしようとします。

<%: 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 Decimalテンプレート:

<%@ Control Language="C#" 
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal?>" %>

テンプレート名を渡すことで機能させることができることを知っています。

しかし、他のすべてのテンプレートと同じように、タイプを使用して自動的に機能することを本当に望んでいます。

<%: Html.EditorFor(model => model.SomeNullableDecimal, 
"NullableDecimalTemplate" )%>
4

5 に答える 5

16

ポジティブな解決策を得るために賞金を追加してくれたブライアンに感謝しますが、答えは間違いなくノーであることがわかったと答える必要があります-そのタイプからnull許容テンプレートを自動検出することはできません。テンプレート名を使用する必要があります。

これは、Brad Wilsonのブログ(http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html )からの関連する引用です。彼はMVCの権威ある情報源であるため、彼が次のように言ったとき、私は彼を信じなければなりません。

タイプ名を検索するときは、名前空間なしで単純な名前(つまり、Type.Name)が使用されます。また、タイプがNullableの場合、Tを検索します(したがって、「bool」または「Nullable」のどちらを使用しているかにかかわらず、ブール型テンプレートを取得します)

彼はまた言い続けます

つまり、値型のテンプレートを作成する場合は、値がnull許容かどうかを考慮する必要があります。ModelMetadataのIsNullableValueTypeプロパティを使用して、値がnull許容かどうかを判断できます。組み込みのブールテンプレートを使用したこの例を以下に示します。

したがって、この質問に対する答えはありますが、残念ながら答えはいいえです。

null許容テンプレートを使用するには、テンプレート名を明示的に使用する必要があります。

<%: Html.EditorFor(model => model.SomeNullableDecimal, "NullableDecimalTemplate" )%>

または、null許容型と非null許容型の両方を処理する1つのテンプレートを使用できます。

<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
    <%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
    <%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>
于 2011-03-15T10:22:09.080 に答える
2

null許容型のテンプレートを作成するには、テンプレートに基本値型として名前を付けてから、null許容モデルを使用してエディターテンプレートを作成します。

たとえば、int?のテンプレートを作成します。「int32.cshtml」という名前のエディターテンプレートを作成し、intを使用していますか?モデルとして。

于 2014-07-29T20:12:12.070 に答える
1

テンプレートには「Nullable`1」という名前を付ける必要があります。これは任意のNullable構造体と一致するため、モデルタイプを切り替えて、「Nullable`1.ascx」内からタイプに基づいて適切な部分テンプレートをレンダリングできます。

于 2011-03-10T18:52:07.503 に答える
0

あなたが望む方法でそれを行う方法はありません。DecimalとDecimal?のテンプレートは1つだけです。ただし、渡された値が次のようにnull許容型であるかどうかをテンプレートで判別できます。

<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
    <%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
    <%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>

詳細については、このブログ投稿を確認してください

于 2011-02-14T18:49:31.080 に答える
0

はい、Html.EditorForでテンプレートを指定せずにこれを行うことができますが、UIhint属性を使用してnull許容プロパティに対してテンプレートを指定する必要があります。

[UIHint("NullableDecimalTemplate")]
public decimal? SomeNullableDecimal { get; set; }
于 2017-01-11T06:09:33.500 に答える