在过滤器里引入重定向

过滤器的引入:
如果用户进行一个操作,但没有登录,
可以在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. uniq linux下去除重复行命令

    一,uniq干什么用的 文本中的重复行,基本上不是我们所要的,所以就要去除掉.linux下有其他命令可以去除重复行,但是我觉得uniq还是比较方便的一个.使用uniq的时候要注意以下二点 1,对文本操 ...

  2. Mesos编译步骤及部署注意事项(Ubuntu)

    注意事项: 编译过程如果有错误提示少什么库,则相应的安装库即可在编译中出现 g++: internal compiler error: Killed (program cc1plus)的错误是因为内存 ...

  3. POJ2479,2593: 两段maximum-subarray问题

    虽然是两个水题,但是一次AC的感觉真心不错 这个问题算是maximum-subarray问题的升级版,不过主要算法思想不变: 1. maximum-subarray问题 maximum-subarra ...

  4. [读书笔记]算法(Sedgewick著)·第一章(1)

    到家放松放松之后就开始学习算法了,手里拿的是拿的是一本Robert Sedgewick的橙皮书<算法(第四版)>的.这本书与导论那本书的不同之处在于轻数学思想.重实现,也就是说这是一本很不 ...

  5. 记一次 Google 面试经历

    本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 这是我上周去面试的地方.很顺利,我觉得——至少我认为我已经尽我所能,并且无论发生什么事情对我都是有帮助的. 由于 ...

  6. Hadoop源码的编译过程详细解读(各版本)

    说在前面的话   重新试多几次.编译过程中会出现下载某个包的时间太久,这是由于连接网站的过程中会出现假死,按ctrl+c,重新运行编译命令. 如果出现缺少了某个文件的情况,则要先清理maven(使用命 ...

  7. MapKit框架使用

    MapKit框架使用 一.地图的基本使用 1.简介 MapKit:用于地图展示,例如大头针/路线/覆盖层展示等(着重界面展示) 使用步骤: 导入主头文件 MapKit/MapKit.h MapKit有 ...

  8. 2015年10个最佳Web开发JavaScript库

    2015年10个最佳Web开发JavaScript库 现在的互联网可谓是无所不有,有大量的JavaScript项目开发工具充斥于网络中.我们可以参考网上的指导来获取构建代码项目的各种必要信息.如果你是 ...

  9. iOS_icon命名规范 (iPhone_retina屏幕开发)

    iOS_icon命名规范  (iPhone_retina屏幕开发) 规则: 位置名称_功能名称_ 详细区分标志名称@2x.png navigationItem_leftBackIcon@2x.png ...

  10. spring websocket Converters must not be empty

    此文件    WebSocketConfig.java public class WebSocketConfig implements WebSocketMessageBrokerConfigurer ...