MVC4.0 利用IActionFilter实现简单的后台操作日志功能

MVC4.0 利用IActionFilter实现简单的后台操作日志功能

首先我们要了解MVC提供了4种常用的拦截器:IActionFilter(Action拦截器接口)、IExceptionFilter(异常拦截器接口)、IResultFilter(Result拦截器接口)、IAuthorizationFilter(授权拦截器接口)

1.建一张保存操作日志的表

create table system_log
(
	Id char(32) primary key,
	UserId char(32) not null comment '用户Id',
	UserName varchar(50) not null comment '用户名称',
	Tkey varchar(20) not null comment '关键字',
	Description varchar(100) not null comment '操作描述',
	OperateResult int default 0 not null comment '操作结果.0,失败;1,成功;',
	DateTime datetime not null comment '操作时间'
) comment '系统日志';

 2.实现IActionFilter接口(Action拦截器接口),这里定义了2个参数Key和Description,分别表示操作的关键字和描述,方便分类查询和展示

    /// <summary>
    /// 操作日志拦截器
    /// </summary>
    public class LoggerFilter : FilterAttribute, IActionFilter
    {
        /// <summary>
        /// 日志关键字
        /// </summary>
        public string Key { get; set; }

        /// <summary>
        /// 日志描述
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// Action执行后
        /// </summary>
        void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
        {
            var result = ((System.Web.Mvc.JsonResult)filterContext.Result).Data.ToString();

            var logService = new Service.SystemLogService();

            var model = new Data.DomainModels.SystemLog()
            {
                UserId = "管理员Id",
                UserName = "管理员名称",
                Tkey = Key,
                Description = Description,
                OperateResult = result.Contains("True") ? 1 : 0,
            };

            logService.Save(model);
        }

        /// <summary>
        /// Action执行前
        /// </summary>
        void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
        {

        }
    }

 3.使用日志拦截器,在需要记录操作日志的Action上加上拦截器属性就OK了,麻烦的是需要给每个Action定义Key和Description

        /// <summary>
        /// 日志拦截器测试
        /// </summary>
        [LoggerFilter(Key = "key", Description = "做了哪些事情")]
        public ActionResult DoSomething(string param)
        {
            //具体业务逻辑

            return JRCommonHandleResult(true);
        }