一个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