18

すべてのページに特定の動作と値を追加できるように、すべてのビューをカスタムクラスから継承させようとしていますが、いくつかの問題があります。System.Web.Mvc.WebViewPageをサブクラス化しようとしましたが、何をすべきかわからないExecuteプロシージャを実装する必要があります。また、Context変数にアクセスしようとすると、null参照が返されます(本当に奇妙です)。これは私が間違った基本クラスを持っているかもしれないと思うように私を導きます....

何かご意見は?

4

1 に答える 1

31

ディエゴは正しい基本型です(強く型付けされたビューが必要な場合はSystem.Web.Mvc.WebViewPage、から継承する別のクラスが必要です)。Executeメソッドの実装を強制されないようにSystem.Web.Mvc.WebViewPage<TModel>、独自のクラスをとしてマークする必要があります。abstract

更新:カスタム基本クラスを使用するようにすべてのビューを構成するには、~\Views\Web.configファイルを調べます。pageBaseTypeその中には、属性を使用してカスタムタイプを構成できるRazor固有のセクションがあります。

Contextプロパティに関する限り、ビューの実行後に完全に初期化する必要があります。ただし、(たとえば、クラスコンストラクターから)早すぎるアクセスを試みると、使用できない場合があります。いつアクセスしようとしていますか?


Executeメソッドは、ビューのコンパイル時にRazorコンパイラによって提供されるものです。たとえば、次のビューファイルがあるとします

Hello @Name!

Razorコンパイラは、舞台裏で次のクラスを生成します(これは単純化されているため、詳細がずれている可能性がありますが、要点を伝える必要があります)

public class _Some_Generated_Class_Name_ : System.Web.Mvc.WebViewPage {
  public void Execute() {
    Write("Hello ");
    Write(Name);
    Write("!");
  }
}

次に、フレームワークがビュークラスのExecuteメソッドを呼び出し、ビューが実行されます。

于 2010-10-19T01:19:24.173 に答える