ASP.NET MVC3中Razor视图的基类是什么?

20
我试图让所有视图都继承自一个自定义类,以便为所有页面添加某些行为和值,但我遇到了一些问题。我尝试子类化System.Web.Mvc.WebViewPage,但被迫实现一个我不知道应该做什么的Execute过程。而且,如果我尝试访问Context变量,我会得到空引用(非常奇怪)。这让我认为我可能有错误的基类...
有什么想法吗?

你能通过扩展方法为所有类添加行为,还是需要它们成为实例方法? - Roman
主要我需要添加一些可以在视图中引用的变量。我知道可以使用扩展方法来实现这一点,但应该有一种方式可以像aspx视图引擎一样拥有自定义视图页面类。 - Diego
1个回答

32
Diego,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方法,执行您的视图。


在我的类构造函数中 :) 那就是它了。 - Diego
作为问题的补充,Execute过程应该做什么?如果我只是用一个空白过程来覆盖它,这样可以吗? - Diego
@Diego 我已经编辑了我的答案,以说明编译器如何为Execute生成实现。 - marcind
有没有一种方法可以为目录中的所有视图指定基类?我想让普通视图继承我的特定System.Web.Mvc.WebViewPage子类,而指定模型的视图则继承我的特定System.Web.Mvc.WebViewPage<TModel>子类。 - Diego
@Diego 我已添加了一份更新,描述在哪里配置您的基类。 - marcind
我正在使用.NET 6,但在我的解决方案中它无法正常工作。如果我添加Microsoft.Aspnet.Mvc Nuget包,它会抱怨目标是.NET Framework 4.8而不是6.0。我找不到.NET 6中等效的WebViewPage基类。你有什么想法吗? - Jay Imerman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接