如何从 ViewStart 中访问(自定义)Web 助手?

Posted

技术标签:

【中文标题】如何从 ViewStart 中访问(自定义)Web 助手?【英文标题】:How to access (custom) web helpers from within ViewStart? 【发布时间】:2012-06-03 16:33:57 【问题描述】:

我在我的 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()'

我应该在那个执行方法中做什么?我不想在 customViewStart 中做任何花哨的事情,只需访问我的助手即可。

【问题讨论】:

【参考方案1】:

好吧,我怀疑这毕竟是可能的,只是需要先整理一些基本的技术细节。

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(另一个有效场景),您可能需要查看我上面评论中的帖子,该帖子描述了如何修改此自定义视图起始页以访问上下文而不会出现错误。

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

我理解,但我的助手只需要访问一些东西,特别是定义一些布局特征。出于这个原因,我提到了“自定义”网络助手而不是默认的 HTML 助手。 我知道,这就是为什么我说它是一个自定义 Web 助手(而不是 HTML 助手)。我的助手做了一些我需要在我的 View Start 中访问的事情。见***.com/questions/10872649/… 我明白了。你为什么不在某个类上使用静态方法设置布局,比如@ Layout = ThemeHelper.GetLayout(); ? (而不是创建您自己继承的 ViewStart 并为此创建扩展) 不是我想要的(ed),因为那时我需要明确地将上下文传递给我的静态方法,但这绝对是一种解决方法。特别是考虑到它甚至不识别 ViewStartPage 的继承链。

以上是关于如何从 ViewStart 中访问(自定义)Web 助手?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过自定义域名方式访问本地WEB应用

如何通过自定义域名方式访问本地WEB应用

Symfony |如何从控制器中的存储库访问自定义方法?

从 Web SDK 访问 Firebase 自定义令牌声明

如何从 Web 服务提供飞行前请求

我可以从自定义 Web 应用程序访问 HDFS 文件吗