【问题标题】:Custom Model Binder & TryUpdateModelAsync not working as expected自定义模型绑定器和 TryUpdateModelAsync 未按预期工作
【发布时间】:2020-12-23 19:00:56
【问题描述】:

我想我可能误解了 TryUpdateModelAsync 方法的工作原理,我有一个将多部分表单数据传递到 PUT 中的 mt 控制器的过程。

我需要触发模型绑定,使用自定义模型绑定器将表单数据拉出并根据需要对其进行操作并使其可用于进一步处理。

为了这个例子的目的,我试图简化这个过程,这是我能得到的最简单的:

public class HomeController : Controller
    {
        public IActionResult Index()
        {
           return View();
        }

        [HttpPut]
        public async Task<IActionResult> Upload()
        {
            var mod = new TestModel();

            await base.TryUpdateModelAsync(mod, "Model");
            
            return new OkResult();
        }
    }

    [ModelBinder(BinderType = typeof(TestModelBinder))]
    public class TestModel
    {
        public string Name;
    }

    public class TestModelBinder : IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            bindingContext.Result = ModelBindingResult.Success(new TestModel()
            {
                Name = "Some Value"
            });

            return Task.CompletedTask;
        }
    }

所以流程是

  • 客户端对上传操作执行 PUT。
  • 上传操作创建一个类的新实例(在本例中为“TestModel”)
  • 我们调用 TryUpdateModelAsync 传入新的(空)模型。

我期望将mod 变量上的name 设置为“某些值”,因为这是我硬编码模型绑定器要做的事情,但它似乎不起作用。

我做错了什么?

【问题讨论】:

    标签: asp.net-core model-binding .net-core-2.2


    【解决方案1】:

    据我所知,TryUpdateModelAsync 方法用于手动模型绑定,它不会触发自定义模型绑定。由于自定义模型绑定器在您调用 TryUpdateModelAsync 方法之前已经发生。 TryUpdateModelAsync 方法不会调用自定义模型绑定器 BindModelAsync 方法。

    在我看来,如果你想使用手动模型绑定,你可以直接将绑定值设置为Some Value

    【讨论】:

    • 它正在触发自定义模型绑定器,我可以在模型绑定代码和对 TryUpdateModelAsync 的调用中添加断点,可以看到首先调用 tryupdate..,然后它调用自定义模型绑定器,我只是看不出为什么自定义模型绑定器中的 modelBinder.Result 集在传递回控制器时没有应用于模型。
    猜你喜欢
    • 2018-03-09
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2021-10-22
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多