我正在构建这个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页面上,我可以从剃须刀标记访问我的自定义助手:
@MyHelper.SomeMethod()
现在,我需要在帮助器上有条件地做一些事情.我尝试在CSHTML的@ {}启动部分设置帮助器属性,但为时已晚,无法将其考虑在内.
所以,我正在考虑在调用的Action方法上执行它,或者通过重写OnActionExecuting()方法.
我遇到的问题是在控制器中我没有找到一种方法来访问我的自定义助手,例如:
public class AnyController : Controller {
public ActionResult Index() {
MyHelper.SomeProperty = true;
}
}
为了解释它,概念是在一个动作(控制器中的动作代码)中,我想在自定义助手中设置一个属性来启用某些功能.这样就不会在不需要它的视图上呈现.它不同于@section的概念,其中内容在视图中定义,而不是它说“我希望将此功能添加到布局中”,并且布局会输出一些预定义的标记,这些标记将启用该功能并在几个地方视图中可能存在需要“功能支持标记或脚本”的“块”.如果我使用一个部分,那么“常见”脚本会多次出现,这不是我需要的.
话虽如此,如何从控制器中访问基本视图页面中定义的(自定义)帮助器?
最佳答案 考虑通过模型传递信息,因为它更符合MVC.您可以使用强类型模型或弱类型ViewBag(示例 –
Passing data from controller to view).
期望控制器不知道将使用什么样的页面来呈现视图.它只是说“找到一个具有此名称的视图并呈现此数据(模型)”.根据不同的条件,可能会有不同的视图匹配相同的名称,因此通常您无法从控制器设置视图对象的属性.
编辑:为什么技术上很难:
动作方法调用的生命周期(ActionResult Index(){…})与页面的生命周期(WebViewPage对象)不相交.动作完成执行后创建的WebViewPage对象.因此,如果您真的有兴趣将数据从操作直接推送到视图对象(而不是通过内置机制),您将需要弄清楚如何传递一些代码(可能以委托的形式)来查看创建代码.