2014-04-25 2 views
1

Je crée une application d'une seule page. J'ai une classe abstraite nommée ControllerBase, et tous mes contrôleurs en héritent.Impossible de renvoyer une vue d'un autre contrôleur dans OnActionExecuting

J'ai un contrôleur nommé 'Application', qui contient une action nommée 'Container'. Cette vue contient la vue de l'application.

La façon dont je veux que cela fonctionne est: si la requête est AJAX, renvoyez le ActionResult d'un contrôleur. Si la requête n'est pas AJAX, appelez le contrôleur 'Application' et restituez l'action 'Container', en envoyant les données de routage pour que le client prenne soin de faire les appels AJAX pour construire la page.

Voici la base du contrôleur.

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

Voici le contrôleur d'application.

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

Et est ici tout autre contrôleur où toutes les demandes qui lui sont faites doivent être capturés et rendus par le contrôleur d'application si elle n'est pas AJAX.

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

Quand je route vers l'itinéraire suivant:/Business/Index, les règles de OnActionExecuting fonctionnent très bien, mais la vue qui sort ne rend pas le point de vue « conteneur », il rend vue l' « Index ». Je ne peux pas comprendre ce que je fais mal.

Répondre

1

La raison pour laquelle la vue incorrecte a été affichée est due au fait que le contexte du filtre ne pointe pas sur le contrôleur et l'action corrects.

Voici la méthode OnActionExecuting fixe. Maintenant, tous mes contrôleurs vont acheminer vers une seule page, et cette seule page prendra en charge toutes les demandes.

Questions connexes