如何在MVC6中定义类型的默认绑定器?

时间:2015-07-29 10:12:05

标签: asp.net-core asp.net-core-mvc

我有以下工作代码:

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

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

2 个答案:

答案 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));