结果过滤器—MVC项目中结果过滤器(Result Filter)使用

一、什么是结果过滤器?

结果过滤器(ResultFilter),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑。结果过滤器可以替换或更改 Action 结果。在 IActionResult 执行的前后执行,使用它能够控制Action的执行结果,比如:格式化结果等。需要注意的是,它只有在Action方法成功执行完成后才会运行。 一般项目中很少使用。image

执行顺序:

1、执行控制器中的构造函数,实例化控制器

2、执行具体的Action方法

3、执行ResultFilter.OnResultExecuting方法

4、渲染视图或处理结果

5、执行ResultFilter.OnResultExecuted方法

二、结果过滤器实现

结果过滤器定义:

异结果过滤器实现了 IAsyncResultFilter 或 IResultFilter 接口,当实现IAsyncResultFilter重写OnResultExecutionAsync方法,实现IResultFilter,重写OnResultExecuting和OnResultExecuted方法。

/// <summary>
    /// 结果过滤器
    /// </summary>
    public class MyResultFilter : Attribute, IResultFilter
    {

        #region IResultFilter

        /// <summary>
        ///执行之前
        /// </summary>
        /// <param name="context"></param>
        public void OnResultExecuting(ResultExecutingContext context)
        {
            if (context.Result is JsonResult)
            {
                JsonResult result = (JsonResult)context.Result;

                //进行返回结果进行再次封装
                context.Result = new JsonResult(new
                {
                    Success = true,
                    Message = "Ok",
                    Data = result.Value
                });
            }
        }
        /// <summary>
        ///执行之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResultExecuted(ResultExecutedContext context)
        {
            var  result = context.Result;//拿到Json结果

            Console.WriteLine("在执行之后ResultFilter.OnResultExecuted方法");
        }
        #endregion

        #region IAsyncResultFilter

        /// <summary>
        /// 执行时
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
        {
            if (context.Result is JsonResult)
            {
                JsonResult result = (JsonResult)context.Result;
                context.Result = new JsonResult(new
                {
                    Success = true,
                    Message = "Ok",
                    Data = result.Value
                });
            }
            await next.Invoke();
        }
        #endregion
    }

操作级别作用范围过滤器:

在需要使用结果过滤器上的Action标注上特性标签

[MyResultFilter]//作用范围是操作过滤器级别

添加测试Action:

[Route("api/[controller]")]
    [ApiController]
    public class ResultFilterController : Controller
    {

        /// <summary>
        /// 测试:调用返回JSON
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [MyResultFilter]//作用范围是操作过滤器级别
        public IActionResult Test()
        {
            return Json(new
            {
                Id = 008,
                Name = "Aliang",
                Age = 28
            });

        }
    }

三、验证:

接口访问调用:

访问地址:

https://localhost:5001/ResultFilter/Test

调用接口时经过结果过滤器处理返回数据:

image

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我给你写一个实现登录验证的MVC的Authorization过滤器的案例。 首先,我们需要创建一个自定义的Authorization过滤器类,代码如下: ```csharp using System.Web.Mvc; namespace YourNamespace { public class LoginAuthorization : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (filterContext.HttpContext.Session["UserID"] == null) // 判断用户是否登录 { filterContext.Result = new RedirectResult("~/Account/Login"); // 如果用户未登录,则跳转到登录页面 } } } } ``` 在上面的代码,我们继承了AuthorizeAttribute类,并重写了其的OnAuthorization方法。在这个方法,我们判断了用户是否已经登录,如果未登录,则跳转到登录页面。 接下来,我们需要在需要登录验证的控制器或者方法上加上我们刚才创建的Authorization过滤器,代码如下: ```csharp using System.Web.Mvc; namespace YourNamespace.Controllers { [LoginAuthorization] // 加上我们创建的Authorization过滤器 public class HomeController : Controller { public ActionResult Index() { return View(); } } } ``` 在上面的代码,我们在HomeController控制器上加上了我们创建的Authorization过滤器,表示这个控制器的所有方法都需要登录验证。 最后,我们需要在登录页面验证用户的用户名和密码,并将登录成功的用户ID存储到Session,代码如下: ```csharp using System.Web.Mvc; using YourNamespace.Models; namespace YourNamespace.Controllers { public class AccountController : Controller { [HttpGet] public ActionResult Login() { return View(); } [HttpPost] public ActionResult Login(LoginViewModel model) { if (ModelState.IsValid) { // 在这里验证用户的用户名和密码是否正确 // 如果正确,则将用户ID存储到Session Session["UserID"] = 123; return RedirectToAction("Index", "Home"); } else { return View(model); } } } } ``` 在上面的代码,我们首先创建了一个LoginViewModel类,用于存储用户输入的用户名和密码。然后,在Login方法,我们首先判断用户输入的数据是否合法,如果合法,则验证用户名和密码是否正确,并将用户ID存储到Session,最后跳转到首页。如果用户输入的数据不合法,则返回登录页面,并显示相应的错误信息。 好了,现在我们已经实现了一个简单的MVC的Authorization过滤器,用于实现登录验证的功能。当用户访问需要登录验证的页面时,如果未登录,则会自动跳转到登录页面,登录成功后再跳转回原来的页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值