6

ASP.NET MVC 3 を使用してプロジェクトを開始しました。既存のオブジェクト システムの上に構築しているので、最初に行う必要があるのは、存在するさまざまな型の表示テンプレートとエディター テンプレートを定義することです。

MVC でジェネリック引数を使用して DisplayTemplate を定義することは可能ですか? たとえばBitString<T>、列挙型をジェネリック引数として取り、提供された列挙型をラップするオプションのリストを表すクラスがあります。すべての BitString インスタンスを処理する単一の Display/Editor テンプレートを定義できることを願っています。

私は現在、ビューにRazorを使用していますが、これを達成するためにascx(またはそれを行う方法がある場合はストレートC#)と混合して一致させることは気にしません

ありがとう

編集:これはこの質問の重複かもしれないと思います...しかし、それは1年半前なので、誰かがこの時点でより良い答えを持っているのでしょうか? ジェネリック部分ビュー: ジェネリック クラスをモデルとして設定する方法は?

4

4 に答える 4

7

あなたが説明している問題は、ジェネリックの基本的な原則です。

ICollection<Object>がの子クラスでICollection<String>あっても、はの基底クラスではありません。これはコンパイル時に行われるため、基本的に 2 つの異なる ICollection クラス定義を取得します。したがって、それらはキャストできません。(SOの賢い人は、不正確な点についてお気軽に修正してください)StringObject

MVC3 では、次のようにしてこれを回避しました。

class Container{
  /* Stuff here */
}

class Container<T> : Container{
 T Data {get;set;}
}

次に、あなたの見解で

@model Container 

ジェネリック型を知らずに一般的なものだけが必要な場合。

@model Container<SomeDataType>

ジェネリック型データが必要な場合。

使用事例:

モデルを内部に格納する「ModelContainer」クラスを作成し、ページを部分的に表示できるエラー メッセージの配列と一緒に作成します。パーシャルはすべてのページで使用できるため、ジェネリック型が何であるかがわからないため、この回避策が必要です。

タイプを知らずに汎用データにアクセスしようとしている場合、これは使用できません。うまくいけば、これで問題が解決します。

于 2011-07-18T13:44:55.073 に答える
5

ダリルの答えには同意しますが、少しだけ改善します。

interface IContainer{
  dynamic Data {get;}
}

class Container<T> : IContainer{
  T Data {get;set;}
  dynamic IContainer.Data
  {
     get { return this.Data; }
  }
}

次に、ビューで次の操作を行います。

@model IContainer
于 2012-11-30T20:22:02.857 に答える
4

いいえ、このジェネリック型が不明な場合、ジェネリック型のビューを持つことはできません。次のようなモデルを定義することはできません。

@model AppName.Models.BitString<T>

T知っておく必要があります:

@model AppName.Models.BitString<SomeEnum>

これは、古いシステムにあったいくつかのモデルを再利用しようとする代わりに、どのビューモデルを配置し、どのビューモデルをビューに渡すかを検討することをお勧めします。

于 2011-03-13T09:57:42.570 に答える
0

これは理想的ではないかもしれませんが、使用できるはずです

@model BitString<dynamic>
于 2011-04-19T21:53:16.590 に答える