MVC小系列(五)【在过滤器里引入重定向】
在过滤器里引入重定向
过滤器的引入:
如果用户进行一个操作,但没有登录,
可以在Post方法上加个过滤器以验证用户是否登录,如果登录成功,则继续进行操作,如果没有登录,则实现Url的重定向,进行登录页
授权过滤器可以继承自AuthorizeAttribute类,通常重写它的OnAuthorization() 方法,将要验证的逻辑写在方法里,而filterContext就是当前web请求的上下文,如果希望得到当前页面的Request,Response,HttpContext,RouteData等信息,可以通过它得到
注意:对于异步POST,在Controller里一般都是返回JsonResult或者ContentResult,
所以必须要返回一个Javascript的上下文,这样才能让JS脚本执行,而对于同步提交,要返回一个Html页面
1 <script> 2 //异步提交 3 $.ajax({ 4 type: "Post", 5 url: "/common/review", 6 success: function (data) { 7 alert(data.res); 8 } 9 }); 10 11 //同步提交 12 $("form").submit(); 13 </script>
同步表单,返回view或者partialview时,事实上返回的是一个text/html格式的视图
异步表单,返回Json,text,xml,javascript时,事实上返回的是一个text/javascript格式的视图
举个实例:
1 public class RoleFilter : AuthorizeAttribute 2 { 3 const string USER_WARN = "您必须先登陆才能执行本操作"; 4 const string WORKSHOPUSER_WARN = "必须是本工作室的用户才能执行本操作"; 5 const string WORKSHOPTEACHER_WARN = "必须是本工作室的老师才能执行本操作"; 6 bool _roleFlag = false; 7 public RoleFilter(bool RoleFlag) 8 { 9 this._roleFlag = RoleFlag; 10 } 11 public override void OnAuthorization(AuthorizationContext filterContext) 12 { 13 var userId = filterContext.RequestContext.HttpContext.Session["UserID"]; 14 var request = filterContext.RequestContext.HttpContext.Request; 15 var routeData = filterContext.RequestContext.RouteData.Values["Id"]; 16 //同步方式 17 string htmlMsg = @"<html><head><title></title></head><body> 18 <link href='/Scripts/jquery-plugin-boxy/css/boxy.css' rel='stylesheet' type='text/css' /> 19 <script src='/Scripts/jquery-1.4.4.min.js' type='text/javascript'></script> 20 <script src='/Scripts/jquery-plugin-boxy/js/jquery.boxy.js' type='text/javascript'></script> 21 <script src='/Scripts/jquery-plugin-boxy/jBoxyFun.js' type='text/javascript'></script> 22 <script type='text/javascript'> 23 $(function(){ 24 alertHrefFun('msg','url');});</script></body></html>"; 25 //异步方式 26 string jsMsg = @"alertHrefFun('msg','url');"; 27 28 switch (this._roleFlag) 29 { 30 case false: //RoleFlag.User: 31 if (userId == null || Convert.ToInt32(userId) <= 0) 32 { 33 var result = new ContentResult 34 { 35 Content = htmlMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()), 36 ContentType = "text/html", 37 }; 38 if (request.IsAjaxRequest()) 39 { 40 result.Content = jsMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()); 41 result.ContentType = "text/javascript"; 42 } 43 filterContext.Result = result; 44 } 45 46 break; 47 default: 48 break; 49 } 50 } 51 }
注意:如果是返回text/html页面,原来的视图将被覆盖,所以js文件和css文件需要重新引用才行,如果返回是text/javascript,则会使用原页面的脚本文件与样式文件