码迷,mamicode.com
首页 > Web开发 > 详细

MVC中为站点添加是否开启过滤器

时间:2018-03-30 17:22:15      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:post   anr   ansi   end   child   ret   mvc   home   设置   

主要思路

添加一个Attribute以及Filter类,在Filter中根据是否存在Attribute来判断是否跳到站点维护页。

代码实现

Attribute:

    /// <summary>
    ///  站点关闭时也可访问
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class RunWhenSitePausedAttribute : Attribute
    {

    }

Filter:

    /// <summary>
    /// 站点是否开启过滤器
    /// </summary>
    public class PauseSiteCheckFilter : IAuthorizationFilter, ITransientDependency
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }
            if (filterContext.IsChildAction)
                return;

            //判断是否进入站点维护页
            if (!isEnable)//获取后台设置,如果站点关闭则进入以下判断
            {
                var context = HttpContext.Current;

                var methodInfo = filterContext.ActionDescriptor.GetMethodInfoOrNull();

                var isDefined = CanRunWhenSitePaused(methodInfo);

                if (!isDefined)
                {
                    //跳转页面
                    var url = UrlHelper.GenerateUrl(null, "PausePage", "Home", new RouteValueDictionary { { "area", "" } },
                        RouteTable.Routes, context.Request.RequestContext, true);
                    filterContext.Result = new RedirectResult(url);
                }
            }
        }

        /// <summary>
        /// 检查是否存在[RunWhenSitePaused]属性
        /// </summary>
        /// <param name="methodInfo"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        private bool CanRunWhenSitePaused(MethodInfo methodInfo, bool defaultValue = false)
        {
            if (methodInfo == null)
            {
                return false;
            }

            if (!methodInfo.IsPublic)
            {
                return false;
            }

            if (methodInfo.IsDefined(typeof(RunWhenSitePausedAttribute), true))
            {
                return true;
            }

            var classType = methodInfo.DeclaringType;
            if (classType != null)
            {
                if (classType.IsDefined(typeof(RunWhenSitePausedAttribute), true))
                {
                    return true;
                }
            }

            return defaultValue;
        }
    }

MVC中为站点添加是否开启过滤器

标签:post   anr   ansi   end   child   ret   mvc   home   设置   

原文地址:https://www.cnblogs.com/dotnetmonkey/p/8677140.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!