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

  • 相关阅读:
    js中异步方案比较完整版(callback,promise,generator,async)
    10分钟搞懂toString和valueOf函数(详细版)
    Angular ViewChild
    Angular动画
    Angular组件之间的通讯
    用12个例子全面示范Angular的模板语法
    使用c++为node.js扩展模块
    requestAnimationFrame 实现JS动画
    使用CSS修改HTML5 input placeholder颜色
    js数组的方法
  • 原文地址:https://www.cnblogs.com/czcz1024/p/2242042.html
Copyright © 2011-2022 走看看