2014-04-25 70 views
1

我正在創建單個頁面應用程序。我有一個名爲ControllerBase的抽象類,並且我的所有控制器都從它繼承。無法從OnActionExecuting中的其他控制器返回視圖

我有一個名爲'Application'的控制器,其中包含一個名爲'Container'的動作。該視圖包含應用程序視圖。

我希望它的工作方式是:如果請求是AJAX,則從控制器返回ActionResult。如果請求不是AJAX,則調用'Application'控制器並呈現動作'Container',發送路由數據,以便客戶端負責使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); 
     } 
    } 
} 

這裏是應用程序控制器。

​​3210

這裏是任何其他控制器,其中向它提出的任何請求都必須被捕獲並通過應用程序控制器呈現,如果它不是AJAX。

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

當我下面的路線路線:/商務/指數,OnActionExecuting規則做工精細,但出來不呈現「容器」視圖的視圖,它呈現的「索引」視圖。我無法弄清楚我做錯了什麼。

回答

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

現在,我的所有控制器都將路由到單個頁面,並且該單個頁面將處理所有請求。

相關問題