我最近开始使用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混合在一起。 好像码味。 特别是当你很难覆盖此行为。
您可以创建和绑定到你的自由裁量权的现有模式:
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人的原因,感觉一个框架,他们的方式也越来越是因为他们还不知道如何正确地使用它。 下面是与模型结合的一般技巧的文章 。
至于你的咆哮:验证并绑定是分开的,但是,默认模型绑定不触发验证。 这样做的原因是为了让您的应用程序优雅地处理问题结合缺少/无效/不完整的价值,而不是允许结合静默失败或抛出异常。
您可以利用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 { ... }