9

文字列プロパティのみの表示テンプレートを作成し、他のすべてにはデフォルトを使用したいと思います。

次の内容でViews/Shared/DisplayTemplatesにstring.cshtmlを作成しようとしました。

@model string
@Html.TextBoxFor(m => m, new { @readonly = "readonly" })

DisplayFor(m => m.property)を使用するビューを開こうとすると、次のようなエラーが表示されます。ディクショナリに渡されるモデルアイテムのタイプは「System.DateTime」ですが、このディクショナリにはタイプ'System.String'のモデルアイテム。または:ディクショナリに渡されるモデルアイテムのタイプは「System.Int64」ですが、このディクショナリにはタイプ「System.String」のモデルアイテムが必要です。

使用するすべてのタイプに表示テンプレートを追加することでこれを解決できることは知っていますが、カスタムテンプレートが定義されていないすべてのタイプに「デフォルト」テンプレートを使用することも可能だと思いますか?

更新 ダリンの答えの後、私はブラッドのチュートリアルをチェックし、テンプレートを次のように変更しました。

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @readonly = "readonly" })

これは「デフォルト」テンプレートに基づいており、すべてのタイプで機能します。

4

1 に答える 1

12

"Boolean"、"Decimal"、"EmailAddress"、"HiddenInput"、"Html"、"Object"、"String"、"Text"、"Url" の 9 つの組み込み表示テンプレートがあります。

テンプレートがどのように機能し、どのように解決されるかについて詳しく説明している次のブログ投稿をご覧ください。ここからの引用は次のとおりです。

次のテンプレート名が順番に試行されます。

  1. ModelMetadata からの TemplateHint
  2. ModelMetadata からの DataTypeName
  3. タイプの名前 (以下の注を参照)
  4. オブジェクトが複雑でない場合: "String"
  5. オブジェクトが複雑でインターフェースの場合: "Object"
  6. オブジェクトが複雑でインターフェイスではない場合: 型の継承階層を再帰的に調べ、すべての型名を試します。

したがって、ポイント 4 に到達しています。DateTime と Int64 については、これらの型の既定のテンプレートがないためです。

したがって、ModelMetadata のテンプレート ヒントまたは DataType 名を使用して、ビュー モデルの特定のプロパティに対してのみこのカスタム テンプレートを使用できます。

于 2012-06-13T09:23:41.100 に答える