如何在Asp.net MVC中关闭或替换默认的ModelState错误消息?

时间:2009-02-14 22:06:37

标签: .net asp.net-mvc model

我有一个控制器动作,它有一个可以为空的DateTime作为来自我表单上的文本框的参数之一。我注意到如果用户在该文本框中输入“blah”,那么我将获得DateTime参数的Null值,并自动添加模型错误。在这种情况下,添加的ModelState错误是“值'blah'无效”。

我的问题是我的网站支持多种语言,因此我需要本地化此错误。通常我只是验证并自己添加ModelState错误,但在这种情况下我似乎无法摆脱它。如果我为同一个文本框添加另一个ModelState错误,则它不会显示。

4 个答案:

答案 0 :(得分:8)

我非常不同意你到目前为止收到的所有答案。他们都没有真正回答你问的问题,这是如何本地化MVC错误消息。您可能需要花费大量精力解决此问题的单个实例,如果您实际上没有本地化您的应用程序,则仍然会遇到其他50个MVC错误消息的问题。它们在MvcResources.resx中定义,它位于MVC源代码的Resources文件夹中(或者只是使用Reflector浏览程序集)。特别是,您正在寻找Common_ValueNotValidForProperty资源。您可以通过提供本地化的附属程序集来本地化这些消息,就像您本地化任何.NET应用程序一样。 .NET应用程序中的国际化/本地化的细节超出了本答案的范围,但是有很多关于这个主题的书籍。在MVC中执行此操作与在任何其他应用程序中执行此操作没有什么不同,除了在大多数情况下,框架的本地化已经可用。 MVC仍处于测试阶段,据我所知,目前只有英语版本。据推测,这将在发布后发生变化。

答案 1 :(得分:1)

我会从您传递给TryUpdateModel / Update模型的白名单中删除该特定文本框并“手动”验证它,而不是让它通过框架验证。或者,您可以尝试遍历ModelState错误集合,找到要删除的那个,并删除它 - 比如一旦找出想要删除的那个,请使用RemoveItem。

编辑:如果您使用的是默认的ModelBinder,则可以实现自己的。我假设你生成自己的模型错误,你使用的是TryUpdateModel / UpdateModel。

答案 2 :(得分:0)

我可以在操作开始时调用 ModelState.Clear(); 。但是,我不确定我是否喜欢在每个动作中都这样做。

答案 3 :(得分:0)

您可以将DateTime参数设为可为空。然后,如果没有提供任何内容,则不会将错误添加到ModelState。

public ActionResult Method(Datetime? date)
{} 

而不是

public ActionResult Method(Datetime date)
{}