我有以下工作代码:
public ObjectResult GetDocumentById([ModelBinder(BinderType = typeof(CustomModelBinder))] CustomId id)
如何指定CustomModelBinder
作为CustomId
类型的默认活页夹?
答案 0 :(得分:1)
您是否尝试使用CustomId
装饰ModelBinderAttribute
课程?
[ModelBinder(BinderType = typeof(CustomModelBinder))]
public class CustomId { }
您也可以直接在ConfigureServices
课程的Startup
注册模型资料夹(请注意,ASP.NET 5中不再存在IModelBinderProvider
):
public void ConfigureServices(IServiceCollection services) {
services.ConfigureMvc(options => {
options.ModelBinders.Insert(0, new CustomModelBinder());
});
}
由于模型绑定器将是第一个被调用的模型绑定器,因此当它无法处理模型类型时返回null
以确保仍然可以为其他类型调用内置绑定器:
public class CancellationTokenModelBinder : IModelBinder
{
/// <inheritdoc />
public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(CancellationToken))
{
var model = bindingContext.OperationBindingContext.HttpContext.RequestAborted;
var validationNode =
new ModelValidationNode(bindingContext.ModelName, bindingContext.ModelMetadata, model);
return Task.FromResult(new ModelBindingResult(
model,
bindingContext.ModelName,
isModelSet: true,
validationNode: validationNode));
}
return Task.FromResult<ModelBindingResult>(null);
}
}
答案 1 :(得分:0)
以下示例提供了一个自定义绑定器,而不是null
,将空字符串绑定到类型string
的属性
public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext)
{
var key = bindingContext.ModelName;
var value = bindingContext.ValueProvider.GetValue(key);
if ((bindingContext.ModelType == typeof(string)) && (string.IsNullOrWhiteSpace(value.FirstValue)))
{
var result = ModelBindingResult.Success(key, string.Empty);
return Task.FromResult<ModelBindingResult>(result);
}
return Task.FromResult<ModelBindingResult>(default(ModelBindingResult));
}
请注意,与上面发布的答案相比,在DNX 1.0.0-rc1-update1中,该行
return Task.FromResult<ModelBindingResult>(null);
导致编译错误,因为ModelBindingResult
是一个结构(一个不可为空的值类型)。
尝试将其更改为以下内容以修复编译错误
return Task.FromResult<ModelBindingResult>(default(ModelBindingResult));