您的位置:首页 > 其它

爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向~续

2012-12-07 16:13 281 查看
回到目录

上一篇文章已经解决了同步与异步表单提交的页面重定向问题,而为什么要写个“续”呢,原因是,我觉得上次的代码不够美丽,而且有些啰嗦,也不符合我的代码之美原则,所以,我自己的代码进行了一次重构:

两件事:

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

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

有了上面的基础,我们把代码重构一下吧:

/// <summary>
/// 角色过滤器
/// </summary>
public class RoleFilter : AuthorizeAttribute
{
const string USER_WARN = "您必须先登陆才能执行本操作";
const string WORKSHOPUSER_WARN = "必须是本工作室的用户才能执行本操作";
const string WORKSHOPTEACHER_WARN = "必须是本工作室的老师才能执行本操作";
RoleFlag _RoleFlag;
/// <summary>
/// 角色过滤器构造依法
/// </summary>
/// <param name="roleFlag">角色类型</param>
public RoleFilter(RoleFlag roleFlag)
{
_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 RoleFlag.User:
if (userID == null || Convert.ToInt32(userID) <= 0)
{
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;
}
}
}


如果我们觉得代码还是显示有点不完善,我们可以把构建ContentResult对象的语句提取到一个方法上,把常量提升到类级别上,看修改后的代码:

/// <summary>
/// 角色过滤器
/// </summary>
public class RoleFilter : AuthorizeAttribute
{
#region Constructs
/// <summary>
/// 角色过滤器构造依法
/// </summary>
/// <param name="roleFlag">角色类型</param>
public RoleFilter(RoleFlag roleFlag)
{
_RoleFlag = roleFlag;
}
#endregion

#region Consts
/// <summary>
/// 必须登陆警告
/// </summary>
const string USER_WARN = "您必须先登陆才能执行本操作";
/// <summary>
/// 必须是工作室成员警告
/// </summary>
const string WORKSHOPUSER_WARN = "必须是本工作室的用户才能执行本操作";
/// <summary>
/// 必须是工作室老师警告
/// </summary>
const string WORKSHOPTEACHER_WARN = "必须是本工作室的老师才能执行本操作";
#endregion

#region Fields
/// <summary>
/// 同步方式
/// </summary>
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>";
/// <summary>
/// 异步方式
/// </summary>
string jsMsg = @"alertHrefFun('msg','url');";

RoleFlag _RoleFlag;
#endregion

/// <summary>
/// 根据请求上下文类型,返回对象
/// </summary>
/// <param name="request"></param>
/// <param name="jsMsg"></param>
/// <param name="htmlMsg"></param>
/// <returns></returns>
ActionResult GetContentResult(HttpRequestBase request, string Warn)
{
var result = new ContentResult
{
Content = htmlMsg.Replace("msg", Warn).Replace("url", request.UrlReferrer.ToString()),
ContentType = "text/html",
};
if (request.IsAjaxRequest())
{
result.Content = jsMsg.Replace("msg", Warn).Replace("url", request.UrlReferrer.ToString());
result.ContentType = "text/javascript";
}
return result;
}

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"];
switch (this._RoleFlag)
{
case RoleFlag.User:
if (userID == null || Convert.ToInt32(userID) <= 0)
{
filterContext.Result = GetContentResult(request, USER_WARN);
}

break;
default:
break;
}
}
}


值得注意的是:如果是返回text/html页面,然原来的视图将被覆盖,所以你的JS文件与CSS文件需要重新被引用才行,但如果是返回text/javascript对象,则它会使用原页面的脚本文件与样式文件,这一点要清楚。

回到目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: