如何获得对模型绑定的控制
本文关键字:控制 绑定 模型 何获得 | 更新日期: 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 { ... }