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: }
执行了b的filter,执行了b的action,导向到了b的view
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号