在过滤器里引入重定向

过滤器的引入:
如果用户进行一个操作,但没有登录,
可以在Post方法上加个过滤器以验证用户是否登录,如果登录成功,则继续进行操作,如果没有登录,则实现Url的重定向,进行登录页

授权过滤器可以继承自AuthorizeAttribute类,通常重写它的OnAuthorization() 方法,将要验证的逻辑写在方法里,而filterContext就是当前web请求的上下文,如果希望得到当前页面的Request,Response,HttpContext,RouteData等信息,可以通过它得到

注意:对于异步POST,在Controller里一般都是返回JsonResult或者ContentResult,
所以必须要返回一个Javascript的上下文,这样才能让JS脚本执行,而对于同步提交,要返回一个Html页面

 <script>
//异步提交
$.ajax({
type: "Post",
url: "/common/review",
success: function (data) {
alert(data.res);
}
}); //同步提交
$("form").submit();
</script>

同步表单,返回view或者partialview时,事实上返回的是一个text/html格式的视图

异步表单,返回Json,text,xml,javascript时,事实上返回的是一个text/javascript格式的视图

举个实例:

    public class RoleFilter : AuthorizeAttribute
{
const string USER_WARN = "您必须先登陆才能执行本操作";
const string WORKSHOPUSER_WARN = "必须是本工作室的用户才能执行本操作";
const string WORKSHOPTEACHER_WARN = "必须是本工作室的老师才能执行本操作";
bool _roleFlag = false;
public RoleFilter(bool RoleFlag)
{
this._roleFlag = RoleFlag;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
var userId = filterContext.RequestContext.HttpContext.Session["UserID"];
var request = filterContext.RequestContext.HttpContext.Request;
var routeData = filterContext.RequestContext.RouteData.Values["Id"];
//同步方式
string htmlMsg = @"<html><head><title></title></head><body>
<link href='/Scripts/jquery-plugin-boxy/css/boxy.css' rel='stylesheet' type='text/css' />
<script src='/Scripts/jquery-1.4.4.min.js' type='text/javascript'></script>
<script src='/Scripts/jquery-plugin-boxy/js/jquery.boxy.js' type='text/javascript'></script>
<script src='/Scripts/jquery-plugin-boxy/jBoxyFun.js' type='text/javascript'></script>
  <script type='text/javascript'>
$(function(){
alertHrefFun('msg','url');});</script></body></html>";
//异步方式
string jsMsg = @"alertHrefFun('msg','url');"; switch (this._roleFlag)
{
case false: //RoleFlag.User:
if (userId == null || Convert.ToInt32(userId) <= )
{
var result = new ContentResult
{
Content = htmlMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString()),
ContentType = "text/html",
};
if (request.IsAjaxRequest())
{
result.Content = jsMsg.Replace("msg", USER_WARN).Replace("url", request.UrlReferrer.ToString());
result.ContentType = "text/javascript";
}
filterContext.Result = result;
} break;
default:
break;
}
}
}

注意:如果是返回text/html页面,原来的视图将被覆盖,所以js文件和css文件需要重新引用才行,如果返回是text/javascript,则会使用原页面的脚本文件与样式文件

MVC小系列(五)【在过滤器里引入重定向】的更多相关文章

  1. MVC小系列(九)【引入namespace】

    以前在页面引入一个namespace,可以这样: <%@ Import Namespace="Web.Helpers" %> 如果空间是所有页面都需要的,可以写进配置文 ...

  2. MVC小系列(八)【改变Areas的FindView顺序】

    MVC小系列(八)[改变Areas的FindView顺序] 一般项目比较大的话,会根据模块建立Areas,这样结构清晰,也有利于路由的部署, 1 Areas下有自己的_LayOut模板,而如果希望所有 ...

  3. MVC小系列(七)【分部视图中的POST】

    MVC小系列(七)[分部视图中的POST] 在PartialView中进行表单提交的作用:1 这个表单不止一个地方用到,2 可能涉及到异步的提交问题 这两种情况都可能需要把表单建立在分部视图上, 使用 ...

  4. MVC小系列(十三)【全局异常处理与异常日志】

    在MVC网站的global.asax中的Application_Start方法里,有这样一段代码 protected void Application_Start() { //它的主要作用是将全局过滤 ...

  5. MVC小系列(十五)【MVC+ZTree实现对树的CURD及拖拽操作】

    根据上一讲的可以加载一棵大树,这讲讲下如果操作这颗大树 <link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle ...

  6. MVC小系列(四)【向RouteData里扔数据】

    向RouteData里扔数据 当Url做路由之后,QueryString里当然是不可能再存你的信息了,而信息包括控制器,action,参数都会存储在RouteData里,而一般这里的信息都是通过前一个 ...

  7. MVC小系列(二)【Razor 模板引擎】

    Razor 模板引擎 Razor模板页:它使我们不用再使用master模板了 一 :@Url.Content:是可以加载CSS和JS等文件比如: <link href="@Url.Co ...

  8. MVC小系列(十七)【自定义验证规则给下拉框】

    因为下拉框不支持验证,所以写一个attribute特性,让它继承ValidationAttributemvc的特性验证,很直接,无论是数据安全特性上还是页面表现上都不错,它的运行机制: 前台表单验证规 ...

  9. MVC小系列(十一)【Html.BeginForm与Ajax.BeginForm】

    Html.BeginForm与Ajax.BeginForm都是mvc的表单元素,前者是普通的表单提交,而后者是支持异步的表单提交,直接用mvc自带的Ajax.BeginForm就可以很容易完成一个异步 ...

随机推荐

  1. 南阳理工OJ 15 括号匹配

    思路:动态规划,设dp[i][j]表示第i个字符到第j个字符所需要的最少匹配数,则:(1),如果从第i到j-1个字符中没有一个与第j个字符匹配,那么状态转移方程为 dp[i][j] = dp[i][j ...

  2. [NOIP2003]栈

    2003年普及组 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重 ...

  3. 解决 MyEclipse 10 中 JSp页面 “return false” 报错问题

    1.MyEclipse ->. Preferences 2.validation ->>找到JavaScript validator for Js files  builder 下面 ...

  4. oracle logminer全解析

    今天写篇原创的,把在工作中遇到的logminer问题总结下 (1)简介: logminer 工具即可以用来分析在线,也可以用来分析离线日志文件,即可以分析本身自己数据库的重作日志文件,也可以用来分析其 ...

  5. algorithm@ KMP

    一. KMP算法 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,简称KMP算法.KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与 ...

  6. Find longest contiguous sub array

    It's still an Amazon interview question. Given an array containing only stars '*' and hashes '#' . F ...

  7. glusterfs 术语

    Access Control Lists Access Control Lists (ACLs) allows you to assign different permissions for diff ...

  8. storm-starter项目概述

    storm-starter项目包含使用storm的各种各样的例子.项目托管在GitHub上面,其网址为: http://github.com/nathanmarz/storm-starter stor ...

  9. Webview 中 Javascript 无法调用 Java 对象

    [问题产生] Webview 通过 addjavascriptInterface 传递对象给前端,一切正常.但是 Android官方已提醒此功能是有安全风险,改用 safe-java-js-webvi ...

  10. Redis Cluster集群搭建与配置

    Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...