2011-02-26 15 views
16

テンプレート内にクラスを作成することはできますか?以下のような何か...剃刀エンジンテンプレートのクラス

@{ 
    public class MyClass { 
     public MyClass() { 
      Three = new List<string>(); 
     } 

     public string One { get; set; } 
     public int Two { get; set; } 
     public List<string> Three { get; set; } 
    } 
} 

は現在、私は、「テンプレートをコンパイルすることができません。詳細については、エラーのリストを確認してください。」を取得します私はこれをやろうとします。 XMLコンテンツを取得し、XmlSerializerを使用してテンプレート内でMyClassのインスタンスを作成したいと考えています。テンプレートはクラスによって異なるため、私は手作業で直列化解除を実行してモデルに組み込みません。

+1

@functionsキーワードを使用しますか? – rene

+0

あなたは 'MyClass'を別のファイルに持ち出せませんか?これでテンプレートごとに2つのファイルが作成されますが、それはうまくいきます。 –

+1

「アンサー」のチェックを外して、「カークウォール」の答えを正しい答えとしてチェックすることはできますか? –

答えて

5

私はここCodePlex Discussionからの私の応答を投稿します。コードブロック(@ {})を使用すると、実際にメソッド内にコードを記述しています。上記のコードは次のようになります:

public void Execute() 
{ 
    this.Clear(); 
    public class MyClass { 
     public MyClass() { 
      Three = new List<string>(); 
     } 

     public string One { get; set; } 
     public int Two { get; set; } 
     public List<string> Three { get; set;} 
    } 
} 

...もちろん、有効ではありません。あなたが直面するもう一つの問題は、xmlの直列化/直列化を使用することです。タイプは既知でなければなりませんが、テンプレート自体の中でタイプを定義している場合、どのようにして最初にそれを逆シリアル化できますか?動的プロパティと動的な戻り値の型を使用して

public class CustomTemplateBase<T> : TemplateBase<T> 
{ 
    public dynamic Instance { get; set; } 

    public dynamic CreateInstance(string typeName) 
    { 
     Type type = Type.GetType(typeName); 

     // You'd to your deserialisation here, I'm going to 
     // just cheat and return a new instance. 
     return Activator.CreateInstance(type); 
    } 
} 

、私たちは私たちが活性化を通して(インスタンスを作成できるようになる方法を定義した:あなた、カスタムベースのテンプレートを使用している何ができるか

またはデシリアライゼーションなど)を呼び出し、そのメンバーにアクセスします。これをテンプレートで使用するには、次のようにします。

@{ 
    Instance = CreateInstance("ConsoleApplication1.MyClass, ConsoleApplication1"); 
    Instance.One = "Hello World"; 
} 
<h1>@Instance.One</h1> 

ここで、 "MyClass"は自分のアプリケーションのどこかで定義されています。重要なことは、テンプレートごとにインスタンスを作成していることです。

3

私は、必要に応じて任意のカスタムデータ構造を設定できる動的プロパティ(ExpandoObject)を持つ特定のViewModelクラスを使用することをお勧めします。

これはまた、ビューモデルとビュー自体とを分離しています。これは、良い習慣です(HTMLとコードは可読性が懸念される場所ではうまく混ざりません)。私はそれが現在可能であるかわからない

64

はい、これは完全に可能です。それはこれがcompletly最初の場所でのモデル/ビュー/コントローラを持っていることの全体的なアイデアをバイパスしませんでした場合は

@functions { 
    public class MyClass { 
     public MyClass() { 
      Three = new List<string>(); 
     } 

     public string One { get; set; } 
     public int Two { get; set; } 
     public List<string> Three { get; set; } 
    } 
} 
+4

それは良い考えであろうとなかろうと、議論の対象となりますが、これは質問に答えるので、私からupvoteです。 (私のソリューションのビューしか編集できないので、これは私が必要とするものです。コードの臭いにもかかわらず) – DarcyThomas

+3

これは、仲介変換タイプを作成したいが、匿名タイプを使用したくない状況に最適ですそれらを剃刀ヘルパーに渡すことはできません。 悲しいことに、Umbracoのようなプラットフォームはコード重視のアプローチではうまく機能しません。コントローラが、必要な変換をすべて、より具体的なViewModelに完全に実行できる場合は、これを頻繁には行いません。 –

+1

upvote。大規模なプロジェクトでは通常そうするのではなく、通常の小さなウェブマトリックスのものでは、よりスマートで簡単です。なぜすべての厄介なバグ? –

関連する問題