未使用提供的过滤器属性值设置ASP NET Core TypeFilter属性

时间:2020-07-31 02:30:55

标签: c# asp.net-core action-filter

我创建了一个链接到TypeFilter的{​​{1}}。

ActionFilter的用途是在TypeFilter的{​​{1}}中使用。 Action具有一些必需的属性(在构造函数中要求)和一些可选参数。 但是由于存在一些可选属性,并且将来可能还会更多,因此创建支持每种组合的构造函数的机会不大。为了解决这个问题,我在TypeFilter中创建了公共属性,以便能够在属性中设置它们,如下例所示:

Controller

TypeFilter示例代码如下:

        [HttpGet]
    [TypeTestFilter(typeof(WeatherForecast), "myparam1", "myparam2", "myparam2", MaxValue = 10, MinValue = 1)]
    public IEnumerable<WeatherForecast> Get()
    {
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }

如您所见,TypeFilterpublic class TypeTestFilter : TypeFilterAttribute { public int MaxValue { get; set; } public int MinValue { get; set; } public TypeTestFilter(Type type, params string[] parameterNames) : base(typeof(TypeTestActionFilter)) { this.Arguments = new object[] { type, parameterNames, MaxValue, MinValue }; } private class TypeTestActionFilter : IActionFilter { private readonly Type _type; private readonly string[] _parameterNames; private readonly int _maxValue; private readonly int _minValue; public TypeTestActionFilter(Type type, string[] parameterNames, int maxValue, int minValue) { _type = type; _parameterNames = parameterNames; this._maxValue = maxValue; this._minValue = minValue; } public void OnActionExecuting(ActionExecutingContext context) { // code. } public void OnActionExecuted(ActionExecutedContext context) { // code. } } } 是构造函数的参数。执行type时,两个参数均正确设置了值。但是parametersNamesTypeTestActionFilter属性值均未设置。它们只是具有整数(0)的默认值。

我在这里想念什么?为什么没有使用MaxValue的{​​{1}}中的MinValue提供的值来设置这些属性?

如果需要,我可以上传示例项目。

1 个答案:

答案 0 :(得分:0)

据我所知,属性说明如下:

[TypeTestFilter(typeof(WeatherForecast), "myparam1", "myparam2", "myparam2", MaxValue = 10, MinValue = 1)]

等于:

TypeTestFilter anonymousObject = new TypeTestFilter(typeof(WeatherForecast), "myparam1", "myparam2", "myparam2");  
anonymousObject.MaxValue = 10; 
 anonymousObject.MaxValue = 1; 

这意味着我们无法在TypeTestFilter的构造方法中获取最大值和最小值,因为它们没有设置。

要解决此问题,应将max和min值传递给构造方法,如下所示:

    public TypeTestFilter(Type type , int minvalue, int maxvalue, params string[] parameterNames) : base(typeof(TypeTestActionFilter))
    {
        this.Arguments = new object[]
        {
            type,
            parameterNames,
            maxvalue,
            minvalue
        };
    }

结果:

enter image description here