我如何为 MVC6 中的类型定义默认活页夹?
How can i define default binder for type in MVC6?
我有以下工作代码:
public ObjectResult GetDocumentById([ModelBinder(BinderType = typeof(CustomModelBinder))] CustomId id)
如何将 CustomModelBinder
指定为 CustomId
类型的默认活页夹?
你试过用ModelBinderAttribute
装饰你的CustomId
class吗?
[ModelBinder(BinderType = typeof(CustomModelBinder))]
public class CustomId { }
你也可以在你的Startup
class中直接在ConfigureServices
中注册你的model binder(注意IModelBinderProvider
在ASP.NET5中已经不存在了) :
public void ConfigureServices(IServiceCollection services) {
services.ConfigureMvc(options => {
options.ModelBinders.Insert(0, new CustomModelBinder());
});
}
由于您的模型绑定器将是第一个被调用的,return 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);
}
}
这里有一个自定义绑定器的示例,它不是 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
是一个结构(不可为 null 的值类型)。
尝试将其更改为以下内容以修复编译错误
return Task.FromResult<ModelBindingResult>(default(ModelBindingResult));
我有以下工作代码:
public ObjectResult GetDocumentById([ModelBinder(BinderType = typeof(CustomModelBinder))] CustomId id)
如何将 CustomModelBinder
指定为 CustomId
类型的默认活页夹?
你试过用ModelBinderAttribute
装饰你的CustomId
class吗?
[ModelBinder(BinderType = typeof(CustomModelBinder))]
public class CustomId { }
你也可以在你的Startup
class中直接在ConfigureServices
中注册你的model binder(注意IModelBinderProvider
在ASP.NET5中已经不存在了) :
public void ConfigureServices(IServiceCollection services) {
services.ConfigureMvc(options => {
options.ModelBinders.Insert(0, new CustomModelBinder());
});
}
由于您的模型绑定器将是第一个被调用的,return 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);
}
}
这里有一个自定义绑定器的示例,它不是 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
是一个结构(不可为 null 的值类型)。
尝试将其更改为以下内容以修复编译错误
return Task.FromResult<ModelBindingResult>(default(ModelBindingResult));