zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JVM调优-Java中的对象
    Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装
    Navicat for MySQL 64位破解版
    Idea详细配置
    数据库--悲观锁【收藏,待尝试】
    性能问题分析
    java 反射机制之 getDeclaredMethod()获取方法,然后invoke执行实例对应的方法
    Mysql show indexes 查看索引状态
    基于(Redis | Memcache)实现分布式互斥锁
    彻底解决每次打开visio都提示windows正在配置visio的问题
  • 原文地址:https://www.cnblogs.com/czcz1024/p/2242042.html
Copyright © 2011-2022 走看看