如何控制模型绑定?

Kug*_*gel 10 c# model-binding asp.net-mvc-3

我最近开始使用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 ....
}
Run Code Online (Sandbox Code Playgroud)

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

*Rant:我真的不明白为什么在DefaultModelBinder中将视图模型绑定和验证混合在一起.好像代码味道.特别是当它很难覆盖这种行为时.

Hac*_*ese 21

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

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 ....
}
Run Code Online (Sandbox Code Playgroud)

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

我讨厌留下一个巨大的评论,但是有十分之一的人认为一个框架阻碍了他们的方式是因为他们还不知道如何正确使用它.这是一篇关于模型绑定的一般提示的文章.

关于你的咆哮:验证和绑定是分开的,但是,默认的模型绑定器会触发验证.这样做的原因是允许您的应用程序优雅地处理绑定到丢失/无效/不完整值的问题,而不是允许绑定无提示失败或抛出异常.