没有验证的UpdateModel

时间:2011-07-30 20:14:50

标签: c# asp.net asp.net-mvc asp.net-mvc-3 modelbinders

ASP.NET MVC3是否有可能在不调用属性验证属性指定的验证的情况下从FormCollection设置视图模型的属性? UpdateModel<T>(T model)也会调用验证。

背景:

如果存在与数据库的连接,我只能验证模型,但只有来自一个特定表单字段的数据正确(每个组织的访问代码类型)才能建立此连接。如果未建立连接,则抛出异常。

当在此字段中输入的数据不正确时,我不想丢失在所有其他表单字段中输入的值,而是再次向用户显示已输入的值,并对其进行更改以更正错误。< / p>

所以我需要的是基本上像条件验证或模型绑定器根本没有验证。 ASP.NET MVC中是否有类似内置的东西,还是需要编写自己的UpdateModel方法,调用(自定义)模型绑定器?

1 个答案:

答案 0 :(得分:2)

为什么不将viewmodel传递给你的方法,而不是formscollection?这样你可以做到

[HttpPost]
public ActionResult Update(UpdateViewModel model)
{
    if (!Model.IsValid)
    {
        return View(model);
    }
}

因此,如果验证失败,您的用户将被定向回更新视图,模型已经从他们提交的信息中填充。

现在,在我看来,拥有验证属性需要数据库连接,而这反过来可能会抛出异常是错误的方法。我将这些验证转移到验证服务,验证服务被注入控制器(并通过DI获取所需的存储库内容)。每个验证服务都将接受一个视图模型并返回一个ValidationResult实例的集合,然后我通过validation result将它们附加到模型extension method到Controller类(两者都从Project Silk的东西中取出) P&amp; P正在推出)

这样可以更轻松地进行测试,因为您可以模拟存储库并让它返回正确的测试结果...