【问题标题】:Customizing DefaultModelBinder validation messages自定义 DefaultModelBinder 验证消息
【发布时间】:2014-08-15 18:03:07
【问题描述】:

我正在尝试替换 MVC3 中在您未能填写必填字段或填写无效值时显示的默认验证消息。我只在这个问题中解决服务器端验证问题。我的无效值自定义消息正在运行,但缺少必填字段的消息将不适用。

这就是我所做的:

  • 在 Web 项目中添加了一个名为“App_GlobalResources”的 ASP.NET 文件夹,并在该文件夹中放置了一个名为“DefaultMessages.resx”的资源文件,其中包含以下键和值:

    • PropertyValueInvalid:你输入的值无效

    • PropertyValueRequired:此字段为必填项

      (这些不是我将使用的实际消息;它们将使用不同的语言,这是我需要替换默认消息的主要原因。)

  • 像这样在 Global.asax.cs 中使用 DefaultModelBinder 注册资源文件(注意我使用 Ninject 进行依赖注入):

    public class MvcApplication : NinjectHttpApplication
    {
        ...
        protected override void OnApplicationStarted()
        {
            ...
            DefaultModelBinder.ResourceClassKey = "DefaultMessages";
            ...
        }
        ...
    }

在我的模型中,我有一个名为 ExpirationDate 的 DateTime 属性。由于 DateTime 不可为空,因此该属性是隐式必需的。 PropertyValueInvalid 有效;在我提交 ExpirationDate 字段中的无效值(例如 30.02.2014)后,我的自定义消息将呈现在表单中。但是如果我将该字段留空并提交,我只会得到默认的“ExpirationDate 字段是必需的”。

我在这里缺少什么? PropertyValueRequired 不是正确的名称吗?或者它不适用于隐式必需的属性?我还尝试在模型中添加一个显式的必需属性,如下所示:

[Required]
public DateTime ExpirationDate{ get; set; }

但这并没有什么区别。起作用的是向属性添加自定义错误消息,例如:

[Required(ErrorMessage = "We need a date here!")]
public DateTime ExpirationDate{ get; set; }

但我不想对通常只需要通用消息的所有必需属性执行此操作。 (我知道我可以在Required 属性中引用资源文件中的通用消息,而不是直接说明消息,但这仍然会给模型增加不必要的混乱。)

【问题讨论】:

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


【解决方案1】:

对于日期验证,您需要处理以下内容的本地化:FieldMustBeDate 实际上您所做的是正确的,但为了处理所有消息,您需要本地化以下消息以防万一:

FieldMustBeDate
FieldMustBeNumeric
PropertyValueInvalid
PropertyValueRequired

【讨论】:

  • 我无法验证这是否解决了问题,因为我们已经转向 MVC 5.2,但看起来似乎是合理的。
猜你喜欢
  • 2012-12-12
  • 2014-05-31
  • 2011-10-21
  • 1970-01-01
  • 2017-06-28
  • 2017-12-13
  • 2013-07-10
相关资源
最近更新 更多