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.