关于MVC过滤器的问题

我目前要使用MVC过滤器来校验用户是否登录以及实现一些简单权限控制的功能。参照网上的资料重写了ActionFilterAttribute类里面的OnActionExecuting方法,说是在Action执行之前会先执行该方法。各位先看一下代码:

public class AuthorizeFilter : ActionFilterAttribute
{
//Action方法执行之前执行此方法
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.RouteData.Values["controller"].ToString().Contains("Login"))return;
base.OnActionExecuting(filterContext);

//校验用户是否已经登录
if (UserCookie.UserId == null || UserCookie.UserName == null)
{ //跳转到登陆页
filterContext.HttpContext.Response.Redirect("/Login/LoginIndex");

}
else
{

string conName = filterContext.RouteData.Values["controller"].ToString();
if (conName.Contains("Home")) return;
string actName = filterContext.RouteData.Values["action"].ToString();
LoginBLL _bll = new LoginBLL();
if(!_bll.GetPermission(UserCookie.UserId,conName,actName))//判断用户是否有权限执行Action
{
return;
//filterContext.HttpContext.Response.Redirect("~/Login/ErroPage");
}

}

}
}


目前的问题是,虽然在执行每个加过过滤器的Action之前会执行OnActionExecuting方法,但是执行完OnActionExecuting之后,Action也会被执行。比如这里:

[AuthorizeFilter]
public bool ChangeState(string type,string id, int state)
{
return _bll.ChangeState(type,id, state);
}

AuthorizeFilter过滤器判断操作人是没有权限执行ChangeState的,但是判断完之后它却直接走到ChangeState方法里面去了,即使在在过滤器里跳转了也没用。这是怎么回事,是跳转方式有问题还是过滤器其他地方未完善的原因?还有,如果没有权限的话直接在当前页面弹窗提示而不是跳转页面又该怎么实现呢?本人初学MVC,还望各位前辈们能指点一二,谢谢!
...全文
167 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 8 楼 lc2737 的回复:
base.OnActionExecuting(filterContext); 这句放在判断里面去,你前面就已经执行方法,当然不行。
谢谢这位大神的提点,一语惊醒梦中人哪。也谢谢其他各位的回答!
ajaxfeifei 2015-01-16
  • 打赏
  • 举报
回复
引用 7 楼 u013324517 的回复:
[quote=引用 6 楼 starfd 的回复:] 你应该是要RedirectView吧?
不是的,我是想弄成弹窗的模式,而不是跳转。毕竟点一个按钮没有权限就跳转页面体验不大好。[/quote] 如果你要弹窗模式那就要使用ajax才行,否则弹不了,使用Ajax模式,然后在

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
        //Action方法执行之前执行此方法       
private bool canexcute=false;
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.RouteData.Values["controller"].ToString().Contains("Login"))return;
            base.OnActionExecuting(filterContext);
 
            //校验用户是否已经登录           
            if (UserCookie.UserId == null || UserCookie.UserName == null)
            {   //跳转到登陆页    
                filterContext.HttpContext.Response.Redirect("/Login/LoginIndex");
 
            }
            else
            {
                
                string conName = filterContext.RouteData.Values["controller"].ToString();
                if (conName.Contains("Home")) return;
                string actName = filterContext.RouteData.Values["action"].ToString();
                LoginBLL _bll = new LoginBLL();
                if(!_bll.GetPermission(UserCookie.UserId,conName,actName))//判断用户是否有权限执行Action
                {
                   canexcute=false;
                }
else
{
canexcute=true;
}
 
            }
 
        }
            base.OnAuthorization(filterContext);
        }
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
          //测试用
return canexcute;
        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            var manager=new AuthorizationManager("");
            var messageAll = HtmlControlEx.GetLanguage("NoAuthorization").Replace("{0}",manager.GetActionName(_controllerName, _actionName));
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                var result = new BasePageResult(-5);
                result.Message = messageAll;
                filterContext.Result = new JsonResult { Data=result};//这里返回Json格式的内容,前台js配合判断
            }
            else
            {
                var message = new HandlerPageError(new Exception(messageAll), this._controllerName, _actionName);
                filterContext.Result=new ViewResult
                {
                    ViewName = "~/Views/Shared/ShowMessage.cshtml",
                    ViewData = new ViewDataDictionary<HandlerPageError>(message),
                    TempData = filterContext.Controller.TempData
                };
            }
        }

  • 打赏
  • 举报
回复
引用 7 楼 u013324517 的回复:
[quote=引用 6 楼 starfd 的回复:] 你应该是要RedirectView吧?
不是的,我是想弄成弹窗的模式,而不是跳转。毕竟点一个按钮没有权限就跳转页面体验不大好。[/quote] 弹窗是js的事情了啊,亲,那你可以直接返回一个Response,包含特定的标志头的,然后你的js监控这个Response头,有这个标志头的就弹个窗呗
ajaxfeifei 2015-01-16
  • 打赏
  • 举报
回复
base.OnActionExecuting(filterContext); 这句放在判断里面去,你前面就已经执行方法,当然不行。
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
你应该是要RedirectView吧?
不是的,我是想弄成弹窗的模式,而不是跳转。毕竟点一个按钮没有权限就跳转页面体验不大好。
  • 打赏
  • 举报
回复
你应该是要RedirectView吧?
  • 打赏
  • 举报
回复
引用 3 楼 x556549 的回复:
[quote=引用 1 楼 u013324517 的回复:] 求大神帮忙..
如果想要action不执行的话,需要你的else里面没有跳转 也就是缺少这一句 filterContext.HttpContext.Response.Redirect("你想要跳转的地方"); 如果整个过滤器都判断完,还没有这句话,系统就会执行action[/quote] 不是啊,我一开始就是写这句的。但是它跳转了也执行了Action,所以我把那句注释了写别的试试的。并不是缺少这一句
x556549 2015-01-16
  • 打赏
  • 举报
回复
弹框提示的话直接在方法内判断用户是否已经登录就行了,用过滤器反而麻烦
x556549 2015-01-16
  • 打赏
  • 举报
回复
引用 1 楼 u013324517 的回复:
求大神帮忙..
如果想要action不执行的话,需要你的else里面没有跳转 也就是缺少这一句 filterContext.HttpContext.Response.Redirect("你想要跳转的地方"); 如果整个过滤器都判断完,还没有这句话,系统就会执行action
  • 打赏
  • 举报
回复
自己顶...
  • 打赏
  • 举报
回复
求大神帮忙..

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧