自定义DefaultModelBinder验证消息

时间:2014-06-25 08:52:29

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

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

这就是我所做的:

  • 添加了一个名为" App_GlobalResources"的ASP.NET文件夹。到了web项目,在该文件夹中我放置了一个名为" 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属性,如下所示:

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

但这没有任何区别。向属性添加自定义错误消息的工作原理是什么,例如:

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

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

1 个答案:

答案 0 :(得分:1)

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

FieldMustBeDate
FieldMustBeNumeric
PropertyValueInvalid
PropertyValueRequired