如何确保操作类参数不为null

本文关键字:null 参数 确保操作 | 更新日期: 2023-09-27 18:22:47

给定以下代码:

public CollectionResult<SetupsDetailsModels> GetSetupsDetails([FromUri]SetupsDetailsCollectionFilterMapping filter)

如果请求不包含任何查询参数,则筛选器对象始终为null,如何确保即使没有发送参数,也始终创建实例?

一个简单的方法是添加一个消息处理程序并添加一个伪查询字符串参数,这样总是可以创建对象,但我真的不喜欢这个解决方案。

感谢

如何确保操作类参数不为null

即使使用操作过滤器,也必须将其添加到所有需要的方法中。或者,您可以只使用默认参数。

public CollectionResult<SetupsDetailsModels> GetSetupsDetails([FromUri]SetupsDetailsCollectionFilterMapping filter = new SetupsDetailsCollectionFilterMapping())

放弃我在这里找到的Web API参数绑定返回实例的想法,即使没有请求参数

这就是我要做的:

public override void OnActionExecuting(HttpActionContext actionContext)
{
    var parameterDescriptor = actionContext.ActionDescriptor.GetParameters().FirstOrDefault(x => typeof(CollectionFilterMapping).IsAssignableFrom(x.ParameterType));
    if (parameterDescriptor != null && actionContext.ActionArguments[parameterDescriptor.ParameterName] == null)
    {
        actionContext.ActionArguments[parameterDescriptor.ParameterName] = Activator.CreateInstance(parameterDescriptor.ParameterType);
    }
    base.OnActionExecuting(actionContext);
}

您可以将其设置为路由的默认值:

            routes.MapRoute(
                name: "test",
                url: "{controller}/{action}/{filter}",
                defaults: new { controller = "Home", action = "Index", filter = new SetupsDetailsCollectionFilterMapping() }
            );

如果filter为null,它将创建一个新的SetupsDetailsCollectionFilterMapping实例,否则它将是您通过的filter

这将节省您必须检查所有方法和添加操作筛选器的时间。

只是用类似的东西测试了一下,它确实有效。