ASP.NET Core 过滤器向控制器注入参数 传参

ASP.NET Core 过滤器向控制器注入参数(传参)

场景

如题,在ASP.NET Core使用过程中,过滤器处理相关业务后,有时需要统一初始化一些数据,并将数据传递到控制器和API中。

方法一 ModelStateDictionary

优点:实现简单
缺点:只能传字符串参数,相较于方法二,功能单一

1、写入参数

public class SignFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            //...
            context.ModelState.SetModelValue("Key1",new Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult("Value"));

            base.OnActionExecuting(context);
        }
    }

2、获取参数

 [HttpPost("search")]
 public async Task<IActionResult> Gets([FromBody] MachineSearch searchView)
 {
     var modelStateEntry = ModelState["key1"];
     if(modelStateEntry != null)
         Console.WriteLine(Request.Path+ ":api-ModelStateDictionary:"+ modelStateEntry.AttemptedValue);
}

方法二 自定义IHttpContextAccessor

优点:可以传自定义对象参数
缺点:相较于较ModelStateDictionary,实现复杂些

1、实现IHttpContextAccessor

 public class HttpContextAccessorUOM: HttpContextAccessor
  {
      public string SomeString { get; set; }
  }

2、传参

 public class SignFilter : ActionFilterAttribute
    {
        private IHttpContextAccessor _httpContextAccessor;
        public SignFilter(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }
        public override void OnActionExecuting(ActionExecutingContext context)
        {           
            var val = System.Guid.NewGuid().ToString(); 
            
			((HttpContextAccessorUOM)_httpContextAccessor).SomeString = val;
            
            base.OnActionExecuting(context);
        }
    }

3、注册

Startup中注册

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {       
            services.AddScoped<IHttpContextAccessor, HttpContextAccessorUOM>();
        }
   }

4、获得参数

[Route("api/machine")]
public class MachineController : Controller
{
      public readonly IHttpContextAccessor _httpContextAccessor;

      public BaseController(IHttpContextAccessor httpContextAccessor)
      {
      		_httpContextAccessor = httpContextAccessor;          
      }
	  [HttpPost("search")]
      public async Task<IActionResult> Gets([FromBody] MachineSearch searchView)
      {     
          var httpContextAccessorTemp = (Filters.HttpContextAccessorUOM)_httpContextAccessor;
          if (httpContextAccessorTemp != null)
              System.Console.WriteLine(Request.Path.Value + ":api-HttpContextAccessor:" + httpContextAccessorTemp.SomeString);

          return Ok();
      }
 }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值