如何获得对模型绑定的控制

本文关键字:控制 绑定 模型 何获得 | 更新日期: 2023-09-27 18:35:53

我最近开始使用MVC,我有点失望。框架非但没有帮助我,反而妨碍了我。

我正在尝试编写这样的控制器操作(伪代码)

ActionResult Save(long id, string whichForm)
{
    if (whichForm == "A")
    {
        var vm = CreateModel(Request.Form);
        if (!TryValidate(vm))
            return View(vm);
        else
            return RedirectToRoute("Success");
    }
    else ....
}

基本上,我想控制何时构建视图模型以及何时对其进行验证。这可能吗?如何实现创建模型方法?考虑我可能想在此控制器操作中创建几个不同的视图模型。

*咆哮:我真的不明白为什么视图模型绑定和验证在DefaultModelBinder中混合在一起。似乎是代码气味。特别是当很难覆盖此行为时。

如何获得对模型绑定的控制

您可以自行决定创建并绑定到现有模型:

public ActionResult Save(long id, string whichForm)
{
    if (whichForm == "A")
    {
        var vm = new FormAViewModel();
        if (!TryUpdateModel(vm))
            return View(vm);
        else
            return RedirectToRoute("Success");
    }
    // else ....
}

您还可以选择创建自己的IModelBinder,如果您想完全控制绑定过程。可以替换默认模型绑定程序,也可以为特定类型注册特定IModelBinder实现。但是,我建议,除非您的绑定逻辑很简单,否则您可能希望从DefaultModelBinder派生自定义模型绑定器,并仅覆盖您不喜欢的部分。

我讨厌留下巨魔般的评论,但 10 次中有 9 次有人觉得框架妨碍他们的原因是他们还不知道如何正确使用它。这是一篇包含模型绑定一般提示的文章。

至于你的咆哮:验证和绑定是分开的,但是,默认模型绑定器确实会触发验证。这样做的原因是允许应用程序正常处理绑定到缺失/无效/不完整值的问题,而不是允许绑定以静默方式失败或引发异常。

您可以利用 IModelBinder 接口并编写完整的自定义模型绑定器。这里解释得很好。实质上,此接口公开了一个方法"BindModel",您可以在其中控制模型绑定行为以及验证。

http://www.dotnetcurry.com/ShowArticle.aspx?ID=584

但是,这可能会使问题复杂化,您可能会进入意大利面条代码。如果适合您,我会建议一个简单的"每个模型的操作"。所以你可以写这样的东西:

ActionResult SaveA(long id, AViewModel)
{
      //.... Action to be conducted in case it is form A.
}
ActionResult SaveB(...., BViewModel)
{
       //... Action to be conducted in case it is form B.
}

// Your view models can be structured for code reuse as well.
class AViewModel {  ...  }
class BViewModel : AViewModel {  ...  }