Ⅰ 爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向~续
时候给勤奋者留下串串的果实,而给懒汉只留下一头白发和空空的双手。上一篇文章已经解决了同步与异步表单提交的页面重定向题目,而为什么要写个“续”呢,原因是,我感觉前次的代码不敷秀丽,并且有些烦琐,也不合适我的代码之美原则,所以,我本身的代码进行了一次重构:凡过于把荣幸之事归功于本身的聪慧和聪明的人多半终局是不幸的。两件事:同步表单,返回view或者partialview时,事实上返回的是一个text/html格局的视图异步表单,返回Json,text,xml,javascript时,事实上返回的是一个text/javascript格局的视图有了上方的根蒂根基,我们把代码重构一下吧: 1/// 2/// 角色过滤器 3/// 4publicclass RoleFilter : AuthorizeAttribute 5 { 6conststring USER_WARN = "您必须先登岸才干履行本操纵"; 7conststring WORKSHOPUSER_WARN = "必须是本工作室的用户才干履行本操纵"; 8conststring WORKSHOPTEACHER_WARN = "必须是本工作室的教员才干履行本操纵"; 9 RoleFlag _RoleFlag; 10///11/// 角色过滤器机关依法 12///13///角色类型14public RoleFilter(RoleFlag roleFlag) 15 { 16 _RoleFlag = roleFlag; 17 } 18publicoverridevoid OnAuthorization(AuthorizationContext filterContext) 19 { 20var userID = filterContext.RequestContext.HttpContext.Session["UserID"]; 21var request = filterContext.RequestContext.HttpContext.Request; 22var routeData = filterContext.RequestContext.RouteData.Values["id"]; 23//同步体式格式24string htmlMsg = @" 25 26 27 28 29 30 ¥(function(){ 31 alertHrefFun(""msg"",""url"");});"; 32//异步体式格式33string jsMsg = @"alertHrefFun(""msg"",""url"");"; 3435switch(this._RoleFlag) 36 { 37case RoleFlag.User: 38if(userID == null || Convert.ToInt32(userID)
Ⅱ 爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向
今天主要的问题是,在MVC的Fitler中,如何实现同步提交的Action与异步提交的Action在Filter中的URL重定向问题,举个例子,比如:一个访客身份,它可以看一些贴子,新闻,但如果它希望回复新闻贴子的时间,则必须提示叫它去登陆,对于这个回复表单事实就是一个POST操作,而如何去提交这个POST操作就是我们说的“提交方式”,同步与异步,而要在POST方法上加个过滤器以验证用户是否登陆过,如果登陆成功,则操作继续进行,如果没有登陆,则实现URL的重定向,进入登陆页。操作流程:---------------------------------------------------------------------------------用户查新闻 |希望评论新闻 | ---N 提交用户去登陆 | Y 评论成功----------------------------------------------------------------------------------这个流程已经足够清晰了,现在我们去实现它吧,我不希望把这种验证逻辑写在代码里,原因一,重复代码高原因二,重复代码多后,使代码的可维护性降低原因三,代码臃肿,不美观,这不符合我的“代码之美,代码艺术”的原则原因四,使页面逻辑过于复杂引入过滤器授权过滤器可以继承自AuthorizeAttribute类,我们通常去复写它的OnAuthorization方法,将要进行验证的逻辑写在方法里,而filterContext就是当然WEB请求的上下文,如果希望得到当前页面的Request,Response,HttpContext,RouteData等信息,可以通过它得到。下面给出异步POST与同步POST验证并重定向的代码: 1 if (userID == null || Convert.ToInt32(userID)
Ⅲ 爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向
今天主要的问题是,在MVC的Fitler中,如何实现同步提交的Action与异步提交的Action在Filter中的URL重定向问题,举个例子,比如:一个访客身份,它可以看一些贴子,新闻,但如果它希望回复新闻贴子的时间,则必须提示叫它去登陆,对于这个回复表单事实就是一个POST操作,而如何去提交这个POST操作就是我们说的“提交方式”,同步与异步,而要在POST方法上加个过滤器以验证用户是否登陆过,如果登陆成功,则操作继续进行,如果没有登陆,则实现URL的重定向,进入登陆页。操作流程:---------------------------------------------------------------------------------用户查新闻 |希望评论新闻 |<是否登陆> ---N 提交用户去登陆 | Y 评论成功----------------------------------------------------------------------------------这个流程已经足够清晰了,现在我们去实现它吧,我不希望把这种验证逻辑写在代码里,原因一,重复代码高原因二,重复代码多后,使代码的可维护性降低原因三,代码臃肿,不美观,这不符合我的“代码之美,代码艺术”的原则原因四,使页面逻辑过于复杂引入过滤器授权过滤器可以继承自AuthorizeAttribute类,我们通常去复写它的OnAuthorization方法,将要进行验证的逻辑写在方法里,而filterContext就是当然WEB请求的上下文,如果希望得到当前页面的Request,Response,HttpContext,RouteData等信息,可以通过它得到。下面给出异步POST与同步POST验证并重定向的代码: 1 if (userID == null || Convert.ToInt32(userID) <= 0) 2 { 3 if (request.IsAjaxRequest()) 4 { 5 filterContext.Result = new ContentResult() 6 { 7 Content = ajaxMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()), 8 ContentType = "text/javascript", 9 };10 }11 else12 {13 filterContext.RequestContext.HttpContext.Response.Clear();14 filterContext.HttpContext.Response.Write(_RedirectJSString.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()));15 }16 17 }注意,对于异步POST,在Controller里一般都是返回JsonResult或者ContentResult,所以我们必须也要返回一个Javascript的上下文,这样才能使我们的JS脚本执行,而对于同步提交,我们要返回一个HTML页面。如果大家对JS异步与同步提交不清楚,可以参考下面代码: 1 //异步提交 2 $.ajax({ 3 type: "Post", 4 url: "/common/review", 5 success: function (data) { 6 alert(data.res); 7 } 8 }); 9 10 //同步提交11 $("form").submit();感谢您的阅读!代码改变生活!