我已经在我的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中做任何花哨的事情,只需访问我的助手。
答案 0 :(得分:2)
好的,毕竟可能是我怀疑的,只需要先解决一些细节性的技术细节。
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(另一个有效方案),您可能需要查看我上面评论中的帖子,该帖子描述了如何修改此自定义视图起始页面以无错误地访问上下文。
答案 1 :(得分:0)
据我所知,_ViewStart文件不是常规视图。它只能用于为其他视图设置默认值,例如布局视图。
例如,这是我的_ViewStart文件的完整内容:
@{ Layout = "~/Views/Shared/Layouts/Wide.cshtml"; }
如果这种情况属实,那么文件中就不需要自定义帮助程序,并且您可能会尝试解决首先不应该有的问题。
另外,您可以在Web.config中添加程序集和命名空间,以避免在特定视图中导入它们。我用它来导入我的模型,枚举和扩展方法。