我有一种情况,我想为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
}
这对我来说不一定正确,因为我只处理一个原始类型但是我似乎找不到任何其他方法的文档。任何帮助将不胜感激。
编辑:如果有人偶然发现这个问题,我决定使用帮助程序类来解析参数,因为必须满足最后期限。一旦我有机会弄明白这一点,我将返回并专门发布与此问题相关的解决方案。
答案 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)
{
}