Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从ViewStart中访问(自定义)web帮助程序?_C#_Asp.net_Asp.net Mvc 3_View Helpers - Fatal编程技术网

C# 如何从ViewStart中访问(自定义)web帮助程序?

C# 如何从ViewStart中访问(自定义)web帮助程序?,c#,asp.net,asp.net-mvc-3,view-helpers,C#,Asp.net,Asp.net Mvc 3,View Helpers,我在MVC3 Razor应用程序(ASP.NET)中定义了一些自定义帮助程序,并且在ViewStart代码中我希望访问自定义帮助程序 我注意到它们在_ViewStart中不可访问,这似乎是可以理解的,因为ViewStart来自ViewStartPage而不是WebViewPage 因此,我尝试在自定义ViewStart类中定义帮助器,但结果证明,我需要访问ViewDataContainer才能初始化帮助器 因此,问题是,如何从ViewStart(或自定义ViewStartPage)访问我的自定义

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

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

据我所知,\u ViewStart文件不是常规视图。它只能用于设置其他视图的默认值,例如布局视图

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

@{ Layout = "~/Views/Shared/Layouts/Wide.cshtml"; }
如果这是真的,那么文件中就不需要自定义助手,而且您可能正在尝试解决一个本来不应该遇到的问题


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

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

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

我理解,但我的助手只需要访问一些内容,特别是定义一些布局特征。因此,我提到了“自定义”web帮助程序,而不是默认的HTML帮助程序。我知道,这就是为什么我说它是自定义web帮助程序(而不是HTML帮助程序)。我的助手在我的视图开始中执行我需要访问的操作。我明白了。为什么不在某个类上使用静态方法设置布局,比如
@{layout=ThemeHelper.GetLayout();}
?(与创建自己继承的ViewStart并为此创建扩展相反)这不是我想要的(ed),因为这样我需要明确地将上下文传递给我的静态方法,但这肯定是一种解决方法。特别是考虑到它甚至不识别ViewStartPage的继承链。