4

我正在构建这个 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 的概念不同,而是说“我希望将此功能添加到布局中”,并且布局将输出一些预定义的标记,这些标记将启用该功能并且在几个地方视图中可能存在需要“功能支持标记或脚本”的“掘金”。如果我使用一个部分,那么那个“通用”脚本会出现多次,这不是我需要的。

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

4

1 回答 1

2

考虑通过模型传递信息,因为它更符合 MVC。您可以使用强类型模型或弱类型 ViewBag(示例 -将数据从控制器传递到视图)。

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

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

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

于 2012-06-01T00:23:53.863 回答