如何将参数传递给IActionFilter属性?

时间:2018-06-06 17:31:22

标签: c#

我尝试使用IActionFilter创建自定义属性:

属性:

public class MyAuthorize : TypeFilterAttribute
{
    public int Id { get; set; }

    public MyAuthorize() : base(typeof(MyAuthorizeImplement))
    {
        Arguments = new object[] { Id };
    }

    private class MyAuthorizeImplement : IActionFilter
    {
        private readonly int _id;

        public MyAuthorizeImplement(int id)
        {
            _id = id;
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {                
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            context.Result = new ContentResult
            {
                Content = $"Id: {_id}"
            };
        }
    }
}

动作:

public class HomeController : Controller
{
    [MyAuthorize(Id = 1)]
    public IActionResult Index()
    {
        return View();
    }
}

结果内容:

  

Id:0

我已尝试多次使用不同的Id值,但_id仍为0默认值。然后,我尝试将Idid_id的值类型从int更改为string并传递了一些值,但它是&#39 ; s仍然是null

[MyAuthorize(Id = "abc")]

我错过了什么吗?谢谢!

P / S:我也尝试过这种方式,它有效,但我不想使用它:

在构造函数中,尝试使用id作为参数而不是属性:

// public int Id { get; set; }

public MyAuthorize(int id) : base(typeof(MyAuthorizeImplement))
{
    Arguments = new object[] { id };
}

动作:

public class HomeController : Controller
{
    [MyAuthorize(id: 1)]
    public IActionResult Index()
    {
        return View();
    }
}

结果内容:

  

Id:1

在第一种情况下,构造函数不需要任何参数,它是一个选项但在第二种情况下它是一个选项。这就是我不想使用它的原因。

当我需要一些ruleIdRolesName ...)时,我可以通过它。否则,请将其留空。就像Authorize属性:

一样
[Authorize] -> All login user can assign
[Authorize(Roles = "Administrator")] -> Only user with this role can assign

0 个答案:

没有答案