asp.net-mvc - 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.'
解决方案
推荐阅读
- javascript - 在保持位置的同时切换子元素之间的可见性
- qpid - 使用 x-filter-jms-selector 参数配置 amq.topic 绑定
- swift - Swift iPad - AVAssetWriter AVCapture 会话录制视频在 iPad iOS12.4 几秒钟后获得绿色视频
- vba - 如何设置 PDF 文件导出密码?
- c# - 在使用 WebApi 的 WireMock.Net 中,为什么 baseUrl 不能是 api 的 uri?
- sql-server - 我没有创建表,但在数据库中获得 CREATE TABLE 权限被拒绝
- python - Sklearn cross_val_score 给出的数字与 model.score 明显不同?
- javascript - HTML Canvas 创建垂直虚线
- excel - 从负到正的 X 轴运行总计反映无数据时不正确的运行总计
- python - Python Selenium 键盘动作移动得太快