【问题标题】:How do you turn off or replace the default ModelState error message in Asp.net MVC?如何关闭或替换 Asp.net MVC 中的默认 ModelState 错误消息?
【发布时间】:2009-02-14 22:06:36
【问题描述】:
我有一个控制器动作,它有一个可以为空的 DateTime 作为参数之一,它来自我表单上的一个文本框。我注意到,如果用户在该文本框中输入“blah”,那么我将为 DateTime 参数返回 Null 值,并自动添加模型错误。在这种情况下,添加的 ModelState 错误是“值 'blah' 无效”。
我的问题是我的网站支持多种语言,所以我需要本地化这个错误。通常我只是自己验证并添加 ModelState 错误,但在这种情况下,我似乎无法摆脱它。如果我为同一个文本框添加另一个 ModelState 错误,它不会显示出来。
【问题讨论】:
标签:
.net
asp.net-mvc
model
【解决方案1】:
我非常不同意您迄今为止收到的所有答案。他们都没有真正回答您提出的问题,即如何本地化 MVC 错误消息。如果您没有真正本地化您的应用程序,您可能会花费大量精力来解决这个问题的单个实例,并且在其他 50 个 MVC 错误消息案例中仍然存在相同的问题。它们在 MvcResources.resx 中定义,该文件位于 MVC 源代码的 Resources 文件夹中(或者只是使用 Reflector 浏览程序集)。特别是,您正在寻找Common_ValueNotValidForProperty 资源。您可以通过提供本地化的附属程序集来本地化这些消息,就像本地化任何 .NET 应用程序一样。 .NET 应用程序中的国际化/本地化的细节超出了这个答案的范围,但是有很多关于这个主题的书。在 MVC 中执行此操作与在任何其他应用程序中执行此操作没有什么不同,只是在大多数情况下,框架的本地化已经可用。 MVC 仍处于测试阶段,所以据我所知,它目前仅支持英语。据推测,这将在发布后发生变化。
【解决方案2】:
我会从您传递给 TryUpdateModel/Update 模型的白名单中删除该特定文本框,并“手动”对其进行验证,而不是让框架对其进行验证。或者,您可以尝试遍历 ModelState Error 集合,找到您要删除的那个,然后将其删除——比如说,一旦您确定要删除哪个,就使用 RemoveItem。
编辑:如果您使用默认的 ModelBinder,您可以实现自己的。我假设由于您正在生成自己的模型错误,因此您使用的是 TryUpdateModel/UpdateModel。
【解决方案3】:
我可以在动作开始时调用 ModelState.Clear();。但是,我不确定我是否喜欢在每个动作中都这样做。
【解决方案4】:
您可以使 DateTime 参数为空。然后,如果没有提供任何内容,则不会将错误添加到 ModelState。
public ActionResult Method(Datetime? date)
{}
而不是
public ActionResult Method(Datetime date)
{}