我试图让所有视图都继承自一个自定义类,以便为所有页面添加某些行为和值,但我遇到了一些问题。我尝试子类化System.Web.Mvc.WebViewPage,但被迫实现一个我不知道应该做什么的Execute过程。而且,如果我尝试访问Context变量,我会得到空引用(非常奇怪)。这让我认为我可能有错误的基类...
有什么想法吗?
有什么想法吗?
System.Web.Mvc.WebViewPage
是正确的基础类型(如果您想要强类型视图,则应该有另一个类继承自System.Web.Mvc.WebViewPage<TModel>
)。您应该将自己的类标记为abstract
,这样您就不必实现Execute方法。
更新:要配置所有视图使用您的自定义基础类,请查看~\Views\Web.config
文件。其中有一个特定于Razor的部分,您可以使用pageBaseType
属性来配置您的自定义类型。
就Context属性而言,在视图执行时,它应该已完全初始化。但是,如果您尝试过早访问它(例如从类的构造函数中),则可能无法使用。您何时尝试访问它?
Execute
方法是Razor编译器在编译您的视图时提供的。例如,给定以下视图文件:Hello @Name!
剃刀编译器将在后台生成以下类(这是一个简化版,所以细节可能有所偏差,但应该能够传达重点)
public class _Some_Generated_Class_Name_ : System.Web.Mvc.WebViewPage {
public void Execute() {
Write("Hello ");
Write(Name);
Write("!");
}
}
然后框架会调用您的视图类上的Execute方法,执行您的视图。