MVC小系列(五)【在过滤器里引入重定向】
在过滤器里引入重定向
过滤器的引入:
如果用户进行一个操作,但没有登录,
可以在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小系列(五)【在过滤器里引入重定向】的更多相关文章
- MVC小系列(九)【引入namespace】
以前在页面引入一个namespace,可以这样: <%@ Import Namespace="Web.Helpers" %> 如果空间是所有页面都需要的,可以写进配置文 ...
- MVC小系列(八)【改变Areas的FindView顺序】
MVC小系列(八)[改变Areas的FindView顺序] 一般项目比较大的话,会根据模块建立Areas,这样结构清晰,也有利于路由的部署, 1 Areas下有自己的_LayOut模板,而如果希望所有 ...
- MVC小系列(七)【分部视图中的POST】
MVC小系列(七)[分部视图中的POST] 在PartialView中进行表单提交的作用:1 这个表单不止一个地方用到,2 可能涉及到异步的提交问题 这两种情况都可能需要把表单建立在分部视图上, 使用 ...
- MVC小系列(十三)【全局异常处理与异常日志】
在MVC网站的global.asax中的Application_Start方法里,有这样一段代码 protected void Application_Start() { //它的主要作用是将全局过滤 ...
- MVC小系列(十五)【MVC+ZTree实现对树的CURD及拖拽操作】
根据上一讲的可以加载一棵大树,这讲讲下如果操作这颗大树 <link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle ...
- MVC小系列(四)【向RouteData里扔数据】
向RouteData里扔数据 当Url做路由之后,QueryString里当然是不可能再存你的信息了,而信息包括控制器,action,参数都会存储在RouteData里,而一般这里的信息都是通过前一个 ...
- MVC小系列(二)【Razor 模板引擎】
Razor 模板引擎 Razor模板页:它使我们不用再使用master模板了 一 :@Url.Content:是可以加载CSS和JS等文件比如: <link href="@Url.Co ...
- MVC小系列(十七)【自定义验证规则给下拉框】
因为下拉框不支持验证,所以写一个attribute特性,让它继承ValidationAttributemvc的特性验证,很直接,无论是数据安全特性上还是页面表现上都不错,它的运行机制: 前台表单验证规 ...
- MVC小系列(十一)【Html.BeginForm与Ajax.BeginForm】
Html.BeginForm与Ajax.BeginForm都是mvc的表单元素,前者是普通的表单提交,而后者是支持异步的表单提交,直接用mvc自带的Ajax.BeginForm就可以很容易完成一个异步 ...
随机推荐
- Servlet3.0学习总结(三)——基于Servlet3.0的文件上传
在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不 ...
- linux网站配置文件.htaccess伪静态转换到IIS web.config中
linux下的php网站放到Windows服务器IIS下.htaccess文件伪静态规则转换. 此办法只适合于linux下的php网站放到Windows服务器IIS下,网站除了主页面正常以外子页面 ...
- JZ2440开发笔记(8)——FCLK、HCLK和PCLK
S3C2440中有三种时钟,分别是FCLK,HCLK和PCLK.这三种时钟的功能各不相同,其中FCLK主要是为ARM920T的内核提供工作频率,如图: HCLK主要是为S3C2440 AHB总线(Ad ...
- PHP字符串操作常用函数
/* * 确定字符串长度 * int strlen(string str) * 比较两个字符串 * 1.strcmp函数对两个字符串进行二进制安全的比较,并区分大小写 * int strcmp(str ...
- [读书笔记]算法(Sedgewick著)·第一章(1)
到家放松放松之后就开始学习算法了,手里拿的是拿的是一本Robert Sedgewick的橙皮书<算法(第四版)>的.这本书与导论那本书的不同之处在于轻数学思想.重实现,也就是说这是一本很不 ...
- key_t键和ftok函数
系统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok原型如下: key_t ftok( char * fname, int id ) f ...
- 综合而强大的DATASNAP
从DELPHI2009开始,DATASNAP技术上完全是全新的架构,多层架构不再基于微软的COM,摆脱COM就等于摆脱了WINDOWS的束缚. TCP/IP通信不再需要先开启scktsrvr.exe程 ...
- 单片微机原理P2:80C51外部中断与定时器系统
0. 外部中断 书上的废话当然是很多的了,对于中断我想大家应该早就有一个很直观的认识,就是"设置断点,执行外部外码,然后返回断点"这样的三个过程.中断给系统提供了一个良好的响应模式 ...
- python module的结构
python有很多module,下面是module的结构图: 拿httplib做例子,httlip module有: 4个class( HTTPConnection,HTTPSConnection,H ...
- response对象详解
(响应 javax.servlet.http.HttpServletResponse) 方法名 说明 addCookie 添加一个Cookie对象 addHeader 添加Http文件指定名字头信息 ...