4

我有一种情况,我想为 ASP.NET 核心中的 api 控制器进行自定义参数绑定。在 WebAPI 2.0 中,可以通过实现 IValueProvider 等各种接口并提供 ValueProviderFactory 来执行对原始类型的自定义绑定。就我在此处找到的文档中了解的情况而言,ASP.NET 核心似乎并非如此。

我确实注意到了这篇 SO 帖子,它让我看到了这篇文章,它覆盖了MutableObjectModelBinder的行为。看来我可以按照这些思路做一些事情,例如:

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

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

编辑:如果有人偶然发现这一点,我只是决定使用一个帮助类来解析参数,因为必须在截止日期前完成。一旦我有机会弄清楚这一点,我将返回并专门发布与此问题有关的解决方案。

4

1 回答 1

4

为您的自定义类型创建一个活页夹提供程序类

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)
{
}
于 2017-07-13T03:35:14.680 回答