mvc 基于basecontroller、ActionFilterAttribute及路由的访问登录验证

来源:互联网 发布:大学生淘宝兼职 编辑:程序博客网 时间:2024/06/05 11:35

先看如何定义路由:

    public class RouteConfig    {        public static void RegisterRoutes(RouteCollection routes)        {            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");            routes.MapRoute(                name: "Default",                url: "{controller}/{action}/{id}",                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }            );            routes.MapRoute(                name: "Login",                url: "User/Login",                defaults: new { controller = "User", action = "Login", id = UrlParameter.Optional }            );            routes.MapRoute(                name: "BindPhone",                url: "User/Reg",                defaults: new { controller = "User", action = "Reg", id = UrlParameter.Optional }            );        }    }

只关注后面两个我自己的路由:

第一个:路由名字是Login,当系统请求使用Login这个路由的时候,就跳到 User/Login这个控制器/动作,

id = UrlParameter.Optional
应该是代表携带参数的意思

第二个:路由名字是BindPhone,当系统请求使用BindPhone这个路由的时候,就跳到 User/Reg这个控制器/动作

如果想让整个controller都验证是否登录,同时还有其它控制器属性一起要使用,那么就使用basecontroller这个类:

首先让控制器引用相关的命名空间

using System.Web;using System.Web.Mvc;using System.Web.Routing;
然后重写  System.Web.Mvc.ActionFilterAttribute中OnActionExecuting方法:

 protected override void OnActionExecuting(ActionExecutingContext filterContext)        {            if (UserService.SessionUser != null)            {                if (String.IsNullOrEmpty(UserService.SessionUser.mobile))                {                    filterContext.Result = new RedirectToRouteResult("BindPhone", new RouteValueDictionary { { "link", Request.Url.ToString() } });                    base.OnActionExecuting(filterContext);                }            }            else            {                filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "link", Request.Url.ToString() } });                base.OnActionExecuting(filterContext);            }        }

然后让控制器继承这个basecontroller就可以了

另外一种方式:

新建一个类,类继承System.Web.Mvc.ActionFilterAttribute,引用如下命名空间:

using System.Web.Mvc;using HalfBuy.Biz.Service;using System.Web.Routing;using System.Web;

还是重写:

  public class CheckLoginAttribute : System.Web.Mvc.ActionFilterAttribute    {        public bool IsCheck { get; set; }        public override void OnActionExecuting(ActionExecutingContext filterContext)        {            if (!IsCheck) return;            if (UserService.SessionUser != null)            {                var a = UserService.SessionUser;                if (String.IsNullOrEmpty(UserService.SessionUser.mobile))                {                    filterContext.Result = new RedirectToRouteResult("BindPhone", new RouteValueDictionary { { "link", filterContext.HttpContext.Request.Url.ToString()} });                    base.OnActionExecuting(filterContext);                }            }            else            {                filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "link", filterContext.HttpContext.Request.Url.ToString() } });                base.OnActionExecuting(filterContext);            }        }    }
注意的是,在这里的重写访问修饰符要用public(原因参考:http://blog.csdn.net/panyanyan/article/details/6574903)

然后在要进行访问控制的控制器或者Action前面加[CheckLoginAttribute(IsCheck=true)]即可

参考:

http://blog.csdn.net/shuaihj/article/details/53020428

http://blog.csdn.net/dv66isme/article/details/52046649过滤器
new RouteValueDictionary { { "link", filterContext.HttpContext.Request.Url.ToString() } });
中切勿使用"url",请使用诸如link的关键词,否则与系统的会冲突!



0 0