我如何为 MVC6 中的类型定义默认活页夹?

How can i define default binder for type in MVC6?

我有以下工作代码:

public ObjectResult GetDocumentById([ModelBinder(BinderType = typeof(CustomModelBinder))] CustomId id)

如何将 CustomModelBinder 指定为 CustomId 类型的默认活页夹?

你试过用ModelBinderAttribute装饰你的CustomIdclass吗?

[ModelBinder(BinderType = typeof(CustomModelBinder))]
public class CustomId { }

你也可以在你的Startupclass中直接在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));