3

我想访问当前正在执行的控制器,这样我就可以将适当的 ActionResult 的返回卸载到辅助方法上。为此,我正在寻找与我认为是 ControllerContext.Current 的等价物,但不是。谢谢!

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

这个 FormReponse 设置了帖子的状态和生成的任何错误消息,所以我想要一个 GetActionResult() 方法来执行脚本/noscript 检查(隐藏的表单输入),或者:

  1. 将模型设置为 JSONed FormResponse 并返回一个 View(),或者
  2. 将 FormResponse 序列化到 Session 并返回 Redirect()。

由于这显然会更改返回值并且我不想每次都自己进行检查,因此我需要从 FormResponse 的 GetActionResult 方法调用 View 或 Redirect 以便将其调用为:

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);
    }
4

2 回答 2

4

静态不利于可测试性,并且在 MVC 中非常不鼓励使用。

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

最好的方法是实现你自己的 ActionFilter。这为您提供了一种在操作方法执行之前或之后拦截请求的方法。

编辑:通过在过滤器的 OnActionExecuted 中截取结果,您可以进行 noscript/script 检查并相应地修改 ViewData 以供 View 使用。在 OnActionExecuted 中,您还可以执行 noscript 检查并根据需要完全控制最终的 ActionResult 或 ViewData。

或者,您可以编写自己的 ActionResult 来做出所有这些决定。所以,你的控制器动作最终会

return new MyActionResult(format_and_view_agnostic_model_object);
于 2009-03-01T12:50:06.947 回答
1

似乎没有办法从线程导航到当前控制器。也就是说,您可以获取 ControllerBuilder 并且可以获取 MvcHttpHandler 但两者都不允许您访问处理程序正在使用的控制器实例。

于 2009-03-01T13:09:07.697 回答