ViewStartPage只能与从WebViewPage或其他ViewStartPage派生的页面一起使用

由于一些必需品,我创建了自己的自定义View Start,如下所示:

public abstract class MyViewStart : System.Web.Mvc.ViewStartPage { public My.Helpers.ThemeHelper Themes { get; private set; } public MyViewStart() : base() { Themes = new Helpers.ThemeHelper(base.ViewContext) } } 

需要的是在_ViewStart中我需要做一些取决于主题的布局文件查找,它的作用与问题无关。

我的意见/共享/ _ViewStart.cshtml看起来像这样(删除了无关的东西):

 @inherits MyNamespace.MyViewStart @{ Layout = Themes.ThemeLayout; } 

因此,我们有一个自定义的ViewStart类,它派生自标准的ViewStartPage。 标准_ViewStart.cshtml是一个ViewStartPage。 新的_ViewStart.cshtml是一个MyViewStart页面,而该页面又是一个标准的ViewStartPage,因此所有内容都包含在inheritance中。

但是,当我运行应用程序时,我收到错误:

ViewStartPage只能与从WebViewPage或其他ViewStartPage派生的页面一起使用

这是由我的自定义视图启动类的构造函数中的“Themes = new Helpers.ThemeHelper”行引发的。 那么,当我的自定义视图启动类是ViewStartPage的子节点时,为什么它会抛出该exception?

您无法在构造函数中访问ViewContext,但如果您重写ExecutePageHierarchy,则可以在那里执行。 我修改了你的代码,使它工作:

 public abstract class MyViewStart : System.Web.Mvc.ViewStartPage { public My.Helpers.ThemeHelper Themes { get; private set; } public override void ExecutePageHierarchy() { this.Themes = new Helpers.ThemeHelper(this.ViewContext); base.ExecutePageHierarchy(); } }