2009-03-01 50 views
3

我想访问当前正在执行的控制器,以便将相应的ActionResult的返回卸载到辅助方法上。为此,我正在寻找相当于我认为会是ControllerContext.Current但不是。谢谢!控制器相当于ASP.NET MVC中的HttpContext.Current

编辑澄清:我有一个基于JavaScript的通用表单控件,但我想添加一个选项,以便它与noscript一起使用。此刻,我的控制器将ViewData.Model设置为JSON化的Models.FormResponse <T>。

此FormReponse设置了帖子的状态以及生成的所有错误消息,所以我想要一个执行脚本/无脚本检查(隐藏表单输入)的GetActionResult()方法,并且要么:

  1. 设置模型的JSONed FormResponse并返回一个视图(),或
  2. 序列化FormResponse的会话,并返回一个重定向()。

由于这显然改变返回值,我不想做每一次检查自己,我需要调用查看或为了从FormResponse的GetActionResult方法重定向调用此为:

return formResponse.GetActionResult(); 

我知道更多的航天设计,这可能会变得更加强大,但由于noscript选项目前不是主要功能,我只需要获得一个快速解决方案,不会破坏其他事情。

更新#2

下,在一个ActionResult类中实现,做这项工作对我来说。感谢CVertex!

public override void ExecuteResult(ControllerContext context) 
    { 
     if (CMSEnvironment.NoScript) 
     { 
      Oracle.Response.Redirect(Oracle.Request.UrlReferrer.ToString(), true); 
     } 

     context.Controller.ViewData.Model = _model.ToJSON(); 

     new ViewResult() 
     { 
      ViewName = Areas.Site.Helpers.SharedView.Service, 
      ViewData = context.Controller.ViewData 
     }.ExecuteResult(context); 
    } 
+0

您想在哪里查看此访问权限? – 2009-03-01 12:53:56

回答

4

静态对可测试性不利,并且非常不鼓励MVC。

为什么要访问当前的控制器和操作方法?

执行此操作的最佳方法是implement your own ActionFilter。 这使您可以在执行操作方法之前或之后拦截请求。

编辑: 通过拦截过滤器的OnActionExecuted内的结果,你可以做你的无脚本/脚本检查并相应地修改你的ViewData供View使用。 在OnActionExecuted内部,您也可以执行noscript检查并完全控制最终的ActionResult或ViewData,如您所愿。或者,你可以编写自己的ActionResult来做出所有这些决定。 所以,你的控制器动作,最终确实

return new MyActionResult(format_and_view_agnostic_model_object); 
1

似乎没有被导航到从一个线程电流控制器的方式。这就是你可以得到ControllerBuilder,你可以得到MvcHttpHandler,但既不能让你访问处理程序正在使用的控制器实例。