【问题标题】:UpdateModel without validationUpdateModel 没有验证
【发布时间】:2011-07-30 20:14:49
【问题描述】:

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

背景:

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

当在此字段中输入的数据不正确时,我不想丢失在所有其他表单字段中输入的值,而是将已经输入的值再次呈现给用户并给他一个更改以更正错误。

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

【问题讨论】:

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


    【解决方案1】:

    为什么不将 viewmodel 传递给您的方法,而不是 formscollection?这样就可以了

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

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

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

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

    【讨论】:

    • 如果没有与数据库的连接可用(此时不是这种情况),验证逻辑(作为验证属性实现)将引发异常。所以步骤是: 1. 检查 fieldA 的值是否正确 - 2. 根据 fieldA 的值连接到数据库 - 3. 更新和验证模型。如果 fieldA 的值无效,则无法执行第 2 步和第 3 步。当然,我可以捕获异常,但这些是 EF 抛出的异常,它本身是“隐藏”在存储库模式后面的。所以这不是一个干净的解决方案。
    • 啊,好吧,那你做错了grin会扩展我的答案
    • 感谢您的详尽解释。您认为整体设计可能不是最优的,但我的实际问题更普遍地针对是否真的有一种方法可以在没有验证的情况下更新模型。因此,我仍然走了,让它打开。也许有人想出了一个主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多