【问题标题】:Cannot return a view from a different controller in OnActionExecuting无法从 OnActionExecuting 中的其他控制器返回视图
【发布时间】:2014-06-11 11:28:40
【问题描述】:

我正在创建一个单页应用程序。我有一个名为 ControllerBase 的抽象类,我所有的控制器都继承自它。

我有一个名为“应用程序”的控制器,其中包含一个名为“容器”的操作。此视图包含应用程序视图。

我希望它的工作方式是:如果请求是 AJAX,则从控制器返回 ActionResult。如果请求不是 AJAX,则调用“应用程序”控制器并呈现操作“容器”,发送路由数据,以便客户端负责进行 AJAX 调用以构建页面。

这里是控制器基地。

public class ControllerBase : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;

        // If the request is AJAX, let it go through
        if (request.Headers["X-Requested-With"].IsEqualTo("xmlhttprequest"))
        {
            base.OnActionExecuting(filterContext);
        }
        // If the request is not AJAX, then the response needs to be modified.
        else
        {
            // This is the controller that contains the single-page application view.
            var applicationController = new ApplicationController();
            applicationController.ControllerContext = 
                new ControllerContext(ControllerContext.RequestContext, applicationController);        

            // Render the single page application and let it take care of the result
            filterContext.Result = applicationController
                .Container(filterContext.RouteData.Values["Controller"].ToString(),
                    filterContext.RouteData.Values["Action"].ToString(), null);
        }
    }
}

这是应用程序控制器。

public class ApplicationController : ControllerBase
{
    public ActionResult Container(string controller, string action, string id)
    {
        if (controller.IsEqualTo("application")) controller = null;
        if (action.IsEqualTo("container")) action = null;
        return View(new RequestModel(controller, action, id));
    }
}

这里是任何其他控制器,如果它不是 AJAX,则必须通过应用程序控制器捕获和呈现对其发出的任何请求。

public class BusinessController : ControllerBase
{
    public ActionResult Index()
    {
        return View();
    }
}

当我路由到以下路由:/Business/Index 时,OnActionExecuting 规则工作正常,但出来的视图不会呈现“容器”视图,而是呈现“索引”视图。我不知道我做错了什么。

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    呈现错误视图的原因是过滤器上下文未指向正确的控制器和操作。

    这里是固定的 OnActionExecuting 方法。

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;
    
        // If the request is AJAX, let it go through
        if (request.Headers["X-Requested-With"].IsEqualTo("xmlhttprequest"))
        {
            base.OnActionExecuting(filterContext);
        }
        // If the request is not AJAX, then the response needs to be modified.
        else
        {
            // Get original values of controller and action data
            var controllerName = filterContext.RouteData.Values["Controller"].ToString();
            var actionName = filterContext.RouteData.Values["Action"].ToString();
    
            // Set new values so that the view engine knows what view to render
            filterContext.RouteData.Values["Controller"] = "Application";
            filterContext.RouteData.Values["Action"] = "Container";
    
            // This is the controller that contains the single-page application view.
            var applicationController = new ApplicationController();
            applicationController.ControllerContext = 
                new ControllerContext(ControllerContext.RequestContext, applicationController);
    
            // Render the single page application and let it take care of the result
            filterContext.Result = applicationController.Container(controllerName, actionName, null);
        }
    }
    

    现在我的所有控制器都将路由到一个页面,该页面将处理所有请求。

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 2022-06-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2017-02-13
      • 2016-02-22
      • 2020-02-18
      • 2015-10-15
      相关资源
      最近更新 更多