如何从 ViewStart 中访问(自定义)Web 帮助程序

本文关键字:自定义 Web 帮助程序 访问 ViewStart | 更新日期: 2023-09-27 18:36:05

我已经在我的 MVC3 Razor 应用程序 (ASP.NET) 中定义了一些自定义帮助程序,在 ViewStart 代码中,我想访问我的自定义帮助程序。

我注意到它们在_ViewStart中无法访问,这似乎是可以理解的,因为ViewStart派生自ViewStartPage而不是WebViewPage。

因此,我尝试在自定义 ViewStart 类中定义帮助程序,但事实证明,我需要访问 ViewDataContainer 才能初始化帮助程序。

因此,问题是,如何从 ViewStart(或自定义 ViewStartPage)访问我的自定义帮助程序,如果没有,我是否可以使用 NULL 初始化 viewDataContainer 构造函数属性。我不希望在我的自定义 ViewStartPage 中访问任何 ViewData。

我也尝试实现自定义 ViewStart 类,但它给了我这个错误:

CustomViewStart does not implement inherited abstract member 'System.Web.WebPages.WebPageExecutingBase.Execute()'

我应该在该执行方法中做什么?我不想在自定义视图开始中做任何花哨的事情,只需访问我的助手即可。

如何从 ViewStart 中访问(自定义)Web 帮助程序

好吧,毕竟正如我所怀疑的那样,只是需要先解决一些细节的技术细节。

public abstract class CustomViewStartPage : System.Web.Mvc.ViewStartPage {
    public Helpers.InvariantHelper ConfigHelper { get; private set; }
    public CustomViewStartPage() : base() {
        ConfigHelper = new Helpers.InvariantHelper();
    }
}

现在,我已经在我的 WebViewPage 自定义基页中定义了几个自定义帮助程序,它们为视图执行其工作。但是,在ViewStart中,我需要做某些不需要访问ViewContext(正如我最初认为的那样)的事情(这里只是一个微不足道的例子)。

所以,有了这个,我现在可以在我的 _ViewStart.cshtml 中拥有它:

@* Views/_ViewStart.cshtml *@
@inherits MyNamespace.Web.Mvc.CustomViewStartPage
@{
    var something = ConfigHelper.DisableParentLayout;
}

当然,也可以按照@MortenMertner指示使用类的静态成员(从外部对问题的新视图),但在某些情况下,这可能不是您真正想要的。这里的例子毫无意义,但目的是表明如何为那些需要的人完成它。

另一方面,如果需要访问 ViewContext(另一种有效方案),您可能需要查看我上面评论中的帖子,该帖子描述了如何修改此自定义视图起始页以访问上下文而不会出现错误。

我了解,_ViewStart文件不是常规视图。它只能用于为其他视图设置默认值,例如布局视图。

例如,这是我_ViewStart文件的完整内容:

@{ Layout = "~/Views/Shared/Layouts/Wide.cshtml"; }

如果这成立,则文件中就不需要自定义帮助程序,并且您可能正在尝试解决本来就不应该遇到的问题。

另外,您可以在 Web.config 中添加程序集和命名空间,以避免在特定视图中导入它们。我使用它来导入我的模型、枚举和扩展方法。