如何获得对模型绑定控制?(How to gain control over model bindin

2019-06-25 00:27发布

我最近开始使用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 ....
}

基本上我想有,当我的视图模型,并当它被验证过的控制。 这可能吗? 我怎样才能实现CreateModel方法? 考虑我可能希望这个控制器动作中创建多个不同的视图模式。

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

Answer 1:

您可以创建和绑定到你的自由裁量权的现有模式:

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 ,只是覆盖的部分你不喜欢。

我不想离开一个巨魔上下的评论,但9次中有10人的原因,感觉一个框架,他们的方式也越来越是因为他们还不知道如何正确地使用它。 下面是与模型结合的一般技巧的文章 。

至于你的咆哮:验证并绑定是分开的,但是,默认模型绑定不触发验证。 这样做的原因是为了让您的应用程序优雅地处理问题结合缺少/无效/不完整的价值,而不是允许结合静默失败或抛出异常。



Answer 2:

您可以利用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 {  ...  }


文章来源: How to gain control over model binding?