zoukankan      html  css  js  c++  java
  • 自制MVC框架基础插件介绍

      本文介绍的基础插件不是实现BeforehandCommonAttribute或ProceedPlugin的postsharp插件,这些都是自定义的基础性的拦截,而且在项目中经常用到。

    1). CompiledAttribute

    设置在方法名上,用来说明程序在处理完MVC模式后再去驱动WebForm工作,两者工作模式结合进来。

    控制器代码:

    namespace Jobmate.Controllers
    
    {
    
        public class Default
    
        {
    
            [Compiled]
    
            public virtual IDictionary Compiled1(IDictionary context)
    
            {
    
                context.Add("x", "b");
    
                return context;
    
            }
    
        }
    
    }

    Compiled1.aspx页面代码:

    页面端:

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Compiled1.aspx.cs" Inherits="integration_class_Compiled1" %>
    
    <%="aaa"%>

    页面后端调用:

    public partial class integration_class_Compiled1 : System.Web.UI.Page
    
    {
    
        protected void Page_Load(object sender, EventArgs e)
    
        {
    
            //控制端会传过来一个hashtable,在页面端如果要使用,通过以下手端可使用
    
            IDictionary context = (IDictionary)HttpContext.Current.Items["context"];
    
            Response.Write(context["x"]);
    
        }
    
       
    
    }

    2). DynamicAttribute

    设置在类名上,表示该类是需要被动态拦截的,就是通过aspectsharp拦截。

    控制器代码:

    namespace Jobmate.Controllers
    
    {
    
        [Dynamic]
    
        public class Default
    
    {
    
                 /// <summary>
    
            /// 写特性方式实现
    
            /// </summary>
    
            /// <param name="context"></param>
    
            /// <returns></returns>
    
            [IP(AspectPriority = 0)]
    
            public virtual IDictionary Dynamic1(IDictionary context)   //必须是虚方法,否则没法拦截
    
            {
    
                context.Add("x", "b");
    
                return context;
    
            }
    
        }
    
    }

    Web.config配置:

    <configuration><!--AOP切面,实例化对像时需使用Stephen.Core.Proxy代理声明得到新实例,动态代理,advice放后面的先执行-->
    
             <aspectsharp>
    
                       <configuration>
    
                                aspect processor1 for [Jobmate.Controllers]
    
                                         pointcut method(* Dynamic1(*))
    
                                                   advice(ShareInterceptor)
    
                                         end
    
                                end
    
                       </configuration>
    
             </aspectsharp></configuration>

     

    拦截器ShareInterceptor代码:

    namespace Jobmate.Controllers.Interceptor
    
    {
    
        [Serializable]
    
        public class ShareInterceptor : AspectInterceptor
    
        {
    
            public override void Proceed(IDictionary myContext)
    
            {
    
                myContext.Add("aaa", "xxx");
    
            }
    
        }
    
    }

    Dynamic1.aspx只输入了$aaa

    运行以后页面输出是:xxx

    3). HasSessionAttribute

    设置在方法名上,表示该方法具有会话功能,默认方法是没有会话功能的。

    控制器代码:

    namespace Jobmate.Controllers
    
    {
    
        [Dynamic]
    
        public class Default
    
        {
    
            /// <summary>
    
            /// 通过ValidateKey验证码的方式
    
            /// </summary>
    
            /// <param name="context"></param>
    
            /// <returns></returns>
    
            [Insert(AspectPriority = 2, Key = "Jobmate.Users", StatementID = "UserOpt", ValidateKey = "ValidateNO")]
    
            [LongID(AspectPriority = 1)]
    
            [FormData(AspectPriority = 0)]
    
            [HasSession]
    
            public virtual object Create3Action(IDictionary context)
    
            {
    
                long s = Convert.ToInt64(context[InsertAttribute.ValueKey]);
    
                string st;
    
                if (s > 0)
    
                    st = "操作成功!";
    
                else
    
                    if (s == -404)
    
                        st = "验证码不正确!";
    
                    else
    
                        st = "操作失败!";
    
                HttpContext.Current.Response.Write("<script>alert('" + st + "');document.location.href='HashSession1.aspx'</script>");
    
                HttpContext.Current.Response.End();
    
                return s;
    
            }
    
    }
    
    }

    4). OutputCacheAttribute

    设置在方法名上,缓存页面拼接的字串,下次打开页面直接拿缓存字串,而不用处理相关操作了。

    属性名

    作用

    默认值

    选项说明

    其它说明

    Duration

    过期时间(秒)

    30

    可选

    VaryByParam

    缓存参数,用分逗号隔开,页面只要参数没有变化,就输出缓存中的内容(区分大小写)。

    空值

    可选

    控制器代码:

    namespace Jobmate.Controllers
    
    {
    
        [Dynamic]
    
        public class Default
    
        {
    
            /// <summary>
    
            /// 缓存100秒,这时你再更新数据库数据的话他也不会变了
    
            /// </summary>
    
            /// <param name="context"></param>
    
            /// <returns></returns>
    
            [OutputCache(Duration = 100)]
    
            [Get(Key = "Jobmate.Users.UserOpt")]
    
            public virtual IDictionary OutputCache1(IDictionary context)
    
            {
    
                return context;
    
            }
    
    }
    
    }

    5).直接通过WebForm页面

    新建的webform只要不在控制层对应相应的方法就会执行webform原来的调用。

    以上方式可以demo中体验。

    demo下载:

    http://files.cnblogs.com/netcorner/%E5%9F%BA%E7%A1%80%E6%8F%92%E4%BB%B6%E6%BC%94%E7%A4%BA.rar

  • 相关阅读:
    boost.property_tree的高级用法(你们没见过的操作)
    MFC- OnIdle空闲处理
    华为代码质量军规 (1) 数组访问,必须进行越界保护
    WinSocket 编程
    【C/C++】链表的理解与使用
    单链表
    C++ lambda表达式 (二)
    C++ lambda表达式 (一)
    C++11 volatile 类型
    关于结构体内存对齐方式的总结(#pragma pack()和alignas())
  • 原文地址:https://www.cnblogs.com/netcorner/p/3762053.html
Copyright © 2011-2022 走看看