自制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下载:
https://files.cnblogs.com/netcorner/%E5%9F%BA%E7%A1%80%E6%8F%92%E4%BB%B6%E6%BC%94%E7%A4%BA.rar