首页 > 解决方案 > Dto 类的属性上的 CustomModelBinder

问题描述

我有一个具有特定类属性的 DtoClass,我不想为 DtoClass 拥有一个 CustomModelBinder,而是为其属性的类;我正在使用 asp.net 核心 3.1。

我的 ModelBinder 类是:

public class SessionIdModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        Guard.Against.Null(bindingContext, nameof(bindingContext));

        var modelName = bindingContext.ModelName;
        var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);

        if (valueProviderResult == ValueProviderResult.None)
            return Task.CompletedTask;

        var sessionId = SessionId.Parse(valueProviderResult.FirstValue);
        if (sessionId.IsFailure)
        {
            bindingContext.ModelState.AddModelError(modelName, sessionId.Errors.First().Message);
            bindingContext.Result = ModelBindingResult.Failed();
            return Task.CompletedTask;
        }

        bindingContext.Result = ModelBindingResult.Success(sessionId.Data);
        return Task.CompletedTask;
    }
}

Dto 类是这样的:

public class MergeSessionsDto
{
    [ModelBinder(BinderType = typeof(SessionIdModelBinder), Name = nameof(OldSession))]
    public SessionId OldSession { get; set; }
        
    [ModelBinder(BinderType = typeof(SessionIdModelBinder), Name = nameof(NewSession))]
    // [BindProperty(BinderType = typeof(SessionIdModelBinder), Name = nameof(NewSession))]
    public SessionId NewSession { get; set; }
}

我的控制器中的操作是:

public async Task<IActionResult> MergeSessions([FromBody] MergeSessionsDto dto)
{
    var result = DoTheMerge(dto.OldSession, dto.NewSession);
    return result;
}

在启动课程中,我还注册了ModelBinderProvider

services.AddControllers(options=> options.ModelBinderProviders.Insert(0, new MyCustomModelBinderProvider()))

这就像:

public sealed class MyCustomModelBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        Guard.Against.Null(context, nameof(context));

        if (context.Metadata.ModelType == typeof(SessionId))
            return new BinderTypeModelBinder(typeof(SessionIdModelBinder));

        return null;
    }
}

无论我使用哪种方法[ModelBinder],都不会调用[BindProperty]属性或全局注册,SessionModelBinder并且我收到此错误:

Exception: Invalid error serialization: 'The dto field is required.'

标签: asp.net-mvcasp.net-coremodelbinderscustom-model-binder

解决方案


推荐阅读