4

我有以下控制器方法,它接受命令作为从客户端传递的更改模型。

    [HttpPut]
    [Route("api/features/{name}")]
    public async Task<IActionResult> PutFeatureValueAsync(
        string name,
        [FromBody] SetFeatureCommand command,
        CancellationToken token)
    {
        command.FeatureName = name;
        await mediator.Send(command, token).ConfigureAwait(false);
        return Ok();
    }

问题是如果我想将 {name} 保留在 url 中,我必须手动将 FeatureName 属性复制到命令对象。另一个问题是,如果在模型绑定期间未设置 FeatureName,我将无法正确进行验证。

将路径的 {name} 段自动模型绑定到命令的 FeatureName 属性的最佳方法是什么。

4

1 回答 1

0

这可以通过使用自定义模型绑定来实现。我建议从阅读模型绑定文档开始,然后查看自定义模型绑定主题。它解释了可用的方法和示例,几乎显示了您需要的内容:

  • 自定义模型绑定器(通过自己的实现IModelBinder) 这种方法需要您修改模型:您需要将[ModelBinder]属性应用于您的SetFeatureCommand
  • 自定义模型绑定器提供程序(通过自己的实现IModelBinderProvider)。这就是内置框架绑定器的实现方式。然后使用 MVC 中间件选项注册提供程序:

    services.AddMvc(options =>
    {
       // add custom binder to beginning of collection
       options.ModelBinderProviders.Insert(0, new OwnBinderProvider());
    });
    
于 2017-05-30T12:21:12.933 回答