6

私は、ASP.NET MVC 3を使用してプロジェクトを開始しました。私は既存のオブジェクトシステムの上にビルドしています。最初に行う必要があるのは、存在するさまざまなタイプのエディタテンプレート。ASP.NET MVC 3汎用ディスプレイテンプレート

汎用引数を持つDisplayTemplateをMVCで定義できますか?たとえば、BitString<T>クラスは、総称引数として列挙を受け取り、指定された列挙をラップするオプションのリストを表します。私は、すべてのBitStringインスタンスを処理する単一のDisplay/Editorテンプレートを定義できると期待しています。

この

おかげ

を達成するために、私は現在、私の意見のためにカミソリを使用していますが、私は(それを行う方法があるかどうか、ストレートのC#)ASCXと混合し、一致し気にしません編集: これは、この質問のdupかもしれないと思う...しかし、それは1年半だから、多分誰かがこの時点でより良い答えを持っていますか? Generic partial view: how to set a generic class as model?

答えて

4

いいえ、このジェネリックタイプがわからない場合は、ジェネリックタイプのビューを持つことはできません。これは言われている

@model AppName.Models.BitString<SomeEnum> 

私が代わりにあなたが考えるためにあなたの古いシステムでいたいくつかのモデルを再利用しようとしているのをお勧めします:

@model AppName.Models.BitString<T> 

Tを知らなければなりません:あなたはこのようなモデルを定義することはできませんのビューモデルを入れて、ビューに渡します。

0

これは理想的とは言えないかもしれませんが、あなたは

@model BitString<dynamic> 
+0

これは、あなたはそれが可能だと確信しています...私のために動作しませんでしたか? –

7

を使用することができるはずあなたが記述している問題は、ジェネリック医薬品の基本的な校長です。

ICollection<Object>は、StringObjectの子クラスであっても、ICollection<String>の基本クラスではありません。これはコンパイル時に行われるため、基本的に2つの異なるICollectionクラス定義を取得します。したがって、彼らはキャストすることはできません。 MVC3で

(SO不正確に私を修正すること自由に感じなさいのスマート人々は)私は次のようにして、これを回避してきました:

class Container{ 
    /* Stuff here */ 
} 

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

その後、あなたのビューで

@model Container 

ジェネリックタイプを知らなくても、共通のものだけが必要です。

@model Container<SomeDataType> 

汎用タイプのデータが必要な場合。

使用事例:

私は一緒に部分的にページを表示することができますエラーメッセージの配列を使用して、内部の私のモデルを保存する「ModelContainer」クラスを作成します。パーシャルはすべてのページで使用できるので、汎用タイプがどのようなものか分からないので、この回避策が必要です。

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

5

私はDarylの答えに同意しますが、少し改善が加えられます。

interface IContainer{ 
    dynamic Data {get;} 
} 

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

その後、あなたのビューで次の操作を行います。

@model IContainer