2012-04-25 85 views
8

當您使用Required屬性修飾模型對象的屬性並且未指定ErrorMessageResourceType/Name時,將以「需要{0}」字段的插值形式得到驗證消息。其中,param 0是該屬性的DisplayName屬性。MVC3:如何更改通用[必需的]驗證消息文本?

我想將該默認字符串更改爲其他內容,但我想保留其一般性質,即我不想爲模型對象的每個屬性指定ErrorMessageResourceType/Name。默認字符串存儲在哪裏以及如何更改它?

回答

6

導出自己的屬性是一個公平的選項,以及可能具有最低的開銷上手,但你需要回去和改變的[Required]所有現有用途。您(以及您團隊中的其他人)也需要記住使用(並教導新手使用)未來的合適人選。

另一種方法是將ModelMetadataProvidersModelValidatorProviders替換爲從資源文件返回字符串。這避免了上述缺點。它也爲替換其他屬性的消息(例如MaxLengthAttribute)和支持其他語言奠定了基礎。

protected void Application_Start() 
{ 
    var stringProvider = new ResourceStringProvider(Resources.LocalizedStrings.ResourceManager); 
    ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(stringProvider); 
    ModelValidatorProviders.Providers.Clear(); 
    ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider(stringProvider)); 
} 

以下是完整的sourcedocumentationblog post描述的使用。

6

您是否嘗試過創建RequiredAttribute的派生類並重寫FormatErrorMessage方法?這應該工作:

public class MyRequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return base.FormatErrorMessage(string.Format("This is my error for {0}", name)); 
    } 
} 
+0

是的,但我應該閱讀'MyRequiredAttribute'構造函數中的'DisplayName'元數據屬性(而不是顯式傳遞它),因爲我已經有/需要DisplayName定義。 – 2012-04-25 14:11:01

+1

根據以下鏈接,'name'參數是要包含在格式化消息中的名稱.http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.formaterrormessage。 ASPX – Joshua 2012-04-25 14:18:34