【问题标题】:Is there a way to access a custom helper from a controller?有没有办法从控制器访问自定义助手?
【发布时间】:2012-06-06 06:02:40
【问题描述】:

我正在构建这个 MVC3 Razor ASP.NET 应用程序,在该应用程序中我使用了一个继承自它的自定义 WebViewPage。所以我所有的视图都使用我的自定义 WebViewPage:

public class MyCustomWebViewPage : System.Web.Mvc.WebViewPage
{
    public CustomHelper MyHelper { get; private set; }
         :
}

然后在位于 Views 文件夹中的 web.config 中,我指出 MyCustomViewPage 是我的默认基本页面。

<system.web.webPages.razor>
    <pages pageBaseType="Namespace.MyCustomWebViewPage">
        <namespaces>
             :
        </namespaces>
    </pages>
</system.web.webPages.razor>

到目前为止一切顺利,在 View 的 .cshtml 页面上,我可以从 razor 标记访问我的自定义助手:

@MyHelper.SomeMethod()

现在,我需要有条件地对助手做一些事情。我尝试在 CSHTML 的 @{} 启动部分设置 helper 的属性,但为时已晚,无法将其考虑在内。

所以,我正在考虑在调用的 Action 方法上执行此操作,或者通过覆盖 OnActionExecuting() 方法。

我遇到的问题是,在控制器中我还没有找到访问自定义助手的方法,例如:

public class AnyController : Controller {
    public ActionResult Index() {
        MyHelper.SomeProperty = true;
    }
}

为了进一步解释,这个概念是在一个动作(控制器中的动作代码)中,我想在自定义助手中设置一个属性,以启用某些功能。这样,这不会呈现在不需要它的视图上。它与在视图中定义内容的@section 的概念不同,而是说“我希望将此功能添加到布局中”,并且布局将输出一些预定义的标记,这些标记将启用该功能并且在几个地方视图中可能存在需要“功能支持标记或脚本”的“掘金”。如果我使用一个部分,那么那个“通用”脚本会出现多次,这不是我需要的。

话虽如此,我如何才能从控制器中访问在基本视图页面中定义的(自定义)帮助程序?

【问题讨论】:

    标签: c# asp.net-mvc-3 view controller


    【解决方案1】:

    考虑通过模型传递信息,因为它更符合 MVC。您可以使用强类型模型或弱类型 ViewBag(示例 - Passing data from controller to view)。

    控制器不应该知道将使用哪个页面来呈现视图。它只是说“查找具有此名称的视图并呈现此数据(模型)”。根据不同的条件,可能会有不同的视图匹配相同的名称,因此通常您无法从控制器设置视图对象的属性。

    编辑:为什么它在技术上非常困难:

    操作方法调用 (ActionResult Index(){...}) 的生命周期与页面的生命周期(WebViewPage 对象)不相交。动作完成执行后创建的 WebViewPage 对象。因此,如果您真的有兴趣将数据从操作直接推送到视图对象(而不是通过内置机制),您将需要弄清楚如何将一些代码(可能以委托的形式)传递给视图创建代码。

    【讨论】:

    • 我试图访问的信息完全独立于模型。正如我所指出的,它是一个允许我做某些事情的助手。例如,我可能想或不想在视图中使用的一些 Google AdSense 辅助方法。出于这个原因,我希望能够访问自定义 webviewpage 来告诉它是否渲染某些东西。它也不是部分功能。
    • 我已经添加了 cmets 为什么它会很困难...考虑使用现有方法代替...
    • 呃,我不想在视图渲染后推送东西。我想要,@Alexei-levenkov 在呈现视图之前设置一个属性/属性,以便视图的主布局呈现一些数据(包括一个通用脚本)。完成后我不需要更新任何东西,视图会按我想要的方式呈现。
    • 据我所知,WebViewPage 对象是在 操作方法返回之后创建的——这就是为什么很难从 Controller 的代码中设置任何属性的原因。您的主视图可以查看 ViewBag 并做一些事情 - 可能对您有用...
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多