2014-06-25 126 views
3

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

这是我做了什么:

  • 增加了一个叫做“App_GlobalResources文件”到web项目中的ASP.NET文件夹,该文件夹中,我把所谓的“DefaultMessages.resx”一个资源文件,其中包含下面的键和值:

    • PropertyValueInvalid:值,你输入无效

    • PropertyValueRequired:此字段是必填项

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

  • 登记在Global.asax.cs中的DefaultModelBinder这样的资源文件(注意我用的Ninject依赖注入):

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

在我的模型我有一个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; }

但我不想这样做,所有通常只需要一个通用的消息所需的性能。 (我知道我可以在必需属性中引用资源文件中的通用消息,而不是直接陈述消息,但是这仍然给模型增加了混乱,这应该是不必要的。)

+0

好像你不能设置'DefaultModelBinder'需要消息在资源文件上。问题答案MVC4,但显然与MVC3相同。已经在这里回答http://stackoverflow.com/questions/12545176/mvc-4-ignores-defaultmodelbinder-resourceclasskey – dgarbacz

回答

1

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

FieldMustBeDate 
FieldMustBeNumeric 
PropertyValueInvalid 
PropertyValueRequired 
+0

我无法验证这是否解决了这个问题,因为我们已经转向MVC 5.2,但它似乎是合理的。 –