ASP.NET核心自定义参数绑定

时间:2016-05-12 22:31:21

标签: asp.net asp.net-web-api parameterbinding

我有一种情况,我想为ASP.NET核心中的api控制器进行自定义参数绑定。在WebAPI 2.0中,可以通过实现各种接口(如IValueProvider)并提供一个自定义绑定到基本类型。 ValueProviderFactory。就我从the documentation I found here所理解的情况而言,ASP.NET核心似乎并非如此。

我注意到this SO post引导我this article,它覆盖了MutableObjectModelBinder的行为。看起来我可以沿着这些方式做点什么,例如:

    [HttpGet]
    [Route("api/{domain}/[controller]")]
    public IEnumerable<string> Get([ModelBinder(BinderType = typeof(MyCustomBinder))]string orderby)
    {
        //Do stuff here
    }

这对我来说不一定正确,因为我只处理一个原始类型但是我似乎找不到任何其他方法的文档。任何帮助将不胜感激。

编辑:如果有人偶然发现这个问题,我决定使用帮助程序类来解析参数,因为必须满足最后期限。一旦我有机会弄明白这一点,我将返回并专门发布与此问题相关的解决方案。

1 个答案:

答案 0 :(得分:1)

为自定义类型

创建活页夹提供程序类
public class MyCustomBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        if (context.Metadata.ModelType == typeof(MyCustom))
        {
            return new BinderTypeModelBinder(typeof(MyCustomBinder));
        }

        return null;
    }
}

并在服务中注册

 services.AddMvc(c =>
 {
      c.ModelBinderProviders.Insert(0, new MyCustomBinderProvider());
 });

自定义活页夹可以像

一样
public class MyCustomBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType != typeof(MyCustom))
        {
            return TaskCache.CompletedTask;
        }

        var parameters = new Dictionary<string, string>();
        foreach (var parameter in bindingContext.ModelType.GetProperties())
        {
            var valueProviderResult = bindingContext.ValueProvider.GetValue(parameter.Name);
            if (valueProviderResult.FirstValue != null)
            {
                parameters.Add(parameter.Name, valueProviderResult.FirstValue);
            }
        }

        var result = Activator.CreateInstance(bindingContext.ModelType);

        //write your custom code to map the result with the parameters

        bindingContext.Result = ModelBindingResult.Success(result);

        return TaskCache.CompletedTask;
    }
}

您的自定义类型

[ModelBinder(BinderType = typeof(MyCustomBinder))]
public class MyCustom
{
    public int Page { get; set; }
    public int Rows { get; set; }
}

并且您的控制器可以将自定义类作为查询字符串参数

[HttpGet("data")]
public DataTransferObject GetData(MyCustom query)
{
}