2014-06-25 174 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,但它似乎是合理的。 –