如何在ASP网络核心中从索偿向数据传输对象注入值?

时间:2018-09-30 13:49:34

标签: .net asp.net-core

例如: 我有一个dto作为带有body属性的动作参数

public IActionResult Bar([FromBody]Foo dto)
{
  var claimsIdentity = User.Identity as ClaimsIdentity;
  var uid = Convert.ToInt32(claimsIdentity.Claims.FirstOrDefault(c => c.Type == "sub")?.Value);
  dto.uid = uid;
  _barService(dto);
  return Ok();           
}
public class Foo
{
  public int uid {get;set;} // from claim
  public string something{get;set;} // from front end request
}

当前,我有编写代码来手动向dto提供索赔值

问:在ASP网络核心中,如何将索赔值自动注入dto?

1 个答案:

答案 0 :(得分:2)

如果您不想在控制器中重复代码,则可以将代码放入服务或辅助方法或操作过滤器中。

例如:

public class FillDtoClaimAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var claimsIdentity = context.HttpContext.User.Identity as ClaimsIdentity;
        var uid = Convert.ToInt32(claimsIdentity.Claims.FirstOrDefault(c => c.Type == "sub")?.Value);
        ((Foo)context.ActionArguments["dto"]).uid = uid;
    }
}

然后:

[FillDtoClaim]
public IActionResult Bar([FromBody]Foo dto)
{
    _barService(dto);
    return Ok();           
}