【问题标题】:IValidateObject how to Clear/Reset ModelState.IsValidIValidateObject 如何清除/重置 ModelState.IsValid
【发布时间】:2011-04-14 21:20:14
【问题描述】:

我有一个实现 IValidateObject 的类。我在控制器的操作中做了一些额外的工作后,我的业务规则得到了满足。我遇到的问题是 ModelState.IsValid 仍然是错误的。我正在尝试找到如何重置或重新运行以便更新 ModelState。我尝试了 TryUpdateModel,它触发了 Validate 方法,如果我逐步执行我的规则现在是有效的,但 ModelState.IsValid 仍然是错误的(我可以看到它仍然在抱怨相同的规则)。

    [HttpPost]
    public ActionResult Create(MyModel model)
    {
        //ModelState.IsValid is False at this point

        //model.Do More Stuff To Satisfy IValidateObject rule. At this point all my rules are valid

        TryUpdateModel(model); // <-- If run TryUpdateModel and step through, I can see my rule is valid 

        if (ModelState.IsValid) // this is still False
        {
            //Save
        }
    }

更新:

我最后打了电话

ModelState.Clear();

[HttpPost]

   public ActionResult Create(MyModel model)
   {   
        //model.Do More Stuff To Satisfy IValidateObject rule. At this point all my rules are valid
        ModelState.Clear();

        TryUpdateModel(model); 

        if (ModelState.IsValid)
        {
            //Save
        }
    }

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    我不明白这一点。您有一个控制器操作,它接收用户输入,如果无效,您将手动纠正并愿意在之后测试模型是否有效。如果您手动纠正了它,为什么要再次测试?你知道这将是有效的,不是吗?编写您要覆盖的验证规则有什么意义?

    另请注意,您在 POST 控制器操作中纠正的所有内容(例如更新模型属性)都应后跟 ModelState.Remove("TheKeyOfThePropertyYouHaveManuallyUpdated"),以便这些手动更改产生一些效果。

    【讨论】:

    • 我没有手动纠正输入的数据。我正在添加使我的对象有效的其他数据。
    • @B Z,您所做的违反了良好做法。您应该使用视图模型和映射层,该映射层将在用户收到的视图模型和您将传递给服务层的相应模型之间进行映射。因此,您的控制器操作应该将视图模型作为输入参数,并且在您确保 ModelState 有效之后,这意味着第一级验证已通过(例如必填字段、格式等)。接下来,您映射到您的业务模型并传递给服务层。它是报告模型中任何业务错误的服务层。
    • 例如我的对象有一个子集合。我的业务规则说此子集合中必须至少有一项。但是,这不是用户输入的……具体的业务领域有点难以解释。如果您需要更多信息,我会想到一个更简单的场景......
    • @B Z,正如我在回答中所说,您可以使用ModelState.Remove 清除 ModelState 中的属性。从模型状态中删除相应的属性后,它也会删除相应的错误。但是,如果您这样做,我想强调的是,这违反了任何良好做法,并且您将自行承担风险。我坚持:不是我推荐的。
    • @B Z,不使用视图模型太可怕了。相信我。我只是坚持这样,如果其他人正在阅读这篇文章,他们就会心知肚明。如果您使用视图模型,则无需重新运行任何内容。应用程序将遵循其自然流程。你现在要做的就是与 MVC 应该是的方式作斗争。
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2012-02-19
    • 2020-04-26
    • 1970-01-01
    相关资源
    最近更新 更多