2

我在我的 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 中做任何花哨的事情,只需访问我的助手。

4

2 回答 2

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

于 2012-06-04T00:01:27.153 回答
0

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

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

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

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

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

于 2012-06-03T17:19:42.377 回答