mvc 在PartialView的action filter中使action跳转到另一个action

一个PartialView,他本身的功能比如是显示文章内容

在他得action上加一个filter,用来判断阅读者的权限,如果没有权限,不执行action,而跳转执行另外一个action,不仅仅是视图不一样,另一个action上可能还有filter需要执行

可以用filter中的filterContext.Result=在filter中给action指定result,但是PartialView不支持跳转,无法使用RedirectResult

还有一些其他的方法可以将视图导向到其他的视图,但仅仅是视图不同,并没有真正的执行action或没有执行action上得filter

  1: var controller = ControllerBuilder.Current.GetControllerFactory().CreateController(filterContext.RequestContext,"Home");
  2: filterContext.Controller.ControllerContext.RouteData.Values["action"] = "B";
  3: ((Controller)controller).ActionInvoker.InvokeAction(filterContext.Controller.ControllerContext, "B");
  4: 
  5: filterContext.Result = new EmptyResult();


 经过一些实验,发现上面的代码可以实现

注意,要把当前的ControllerContext中的RouteData的action设置成要导向到的action名。mvc默认是以这个名去找视图的。

如果这里不设置,需要在action B中的reutrn View时明确指定,如

return PartialView("b");

最后,本来的action的result设定为空,就不执行本身的action了。

全部代码

  1:     public class HomeController : Controller
  2:     {
  3:         //主页面,在其中调用A
  4:         public ActionResult Index()
  5:         {
  6:             return View();
  7:         }
  8: 
  9:         [AFilter]//A的filter检测,希望在filter中转向到Baction
 10:         public ActionResult A()
 11:         {
 12:             Response.Write("a action<br>");
 13:             return PartialView();
 14:         }
 15:         [BFilter]//要转向到此action,并且希望能够执行此action上的filter
 16:         public ActionResult B()
 17:         {
 18:             Response.Write("b action<br>");
 19:             return PartialView();
 20:         }
 21:     }
  1:     public class BFilterAttribute:ActionFilterAttribute
  2:     {
  3:         public override void OnActionExecuting(ActionExecutingContext filterContext)
  4:         {
  5:             filterContext.HttpContext.Response.Write("b filter<BR>");
  6:         }
  7:     }

视图

index

@{ Html.RenderAction("A");}

a

a view

b

b view

最关键的afilter

  1:     public class AFilterAttribute:AuthorizeAttribute
  2:     {
  3:         public override void OnAuthorization(AuthorizationContext filterContext)
  4:         {
  5:             var controller =
  6:                 ControllerBuilder.Current.GetControllerFactory().CreateController(filterContext.RequestContext, "Home");
  7:             filterContext.Controller.ControllerContext.RouteData.Values["action"] = "B";
  8:             ((Controller) controller).ActionInvoker.InvokeAction(filterContext.Controller.ControllerContext, "B");
  9: 
 10:             filterContext.Result = new EmptyResult();
 11:         }
 12:     }

image

执行了b的filter,执行了b的action,导向到了b的view

原文地址:https://www.cnblogs.com/czcz1024/p/2242042.html