2012-12-26 258 views
1

我在驗證某些數據類型時遇到了問題。 除字符串外,還有int,short,DateTime等。在我看來,模型類 假設我有以下屬性自定義驗證消息

public int? LineNumber { get; set; } 

當我輸入不正確的值,我得到的MVC錯誤「值‘balblabl’是無效的LineNumber上。」

但是如果我只想出一些類似「Value incorrect」的東西呢?或者如果我想使用其他語言呢?我不知道該怎麼做(當然,我可以使用字符串代替int,但它是痛苦的解決方法)

我已經試過dataannotationsextensions [DataAnnotationsExtensions.Integer(ErrorMessage = "Please enter a valid number.")]屬性。它不工作。我不能使用自定義驗證屬性,因爲後綁定轉換我得到空值在所有情況下不正確的值。我只是不能做我自己的驗證。我可以寫我自己的活頁夾,但它看起來像一個笑話。真的,我認爲自定義驗證消息是必須有featerus之一,我不能相信asp.net mvc沒有一個簡單的方法來做到這一點。

回答

0

當它無法將輸入字符串解析爲其目標類型時,這些錯誤將由默認模型綁定器自動添加。它們不像數據註釋,您可以在其中指定資源而不是經過編碼的字符串錯誤消息。

但是,您可以使用自己的資源文件,請參閱other question。一旦你創建的資源文件,將更新在Global.asax默認模型綁定使用它:

DefaultModelBinder.ResourceClassKey = "MyResources"; 

後自定義資源文件在默認的模型綁定的屬性ResourceClassKey設置,值將根據以下標準(as per the MSDN)解決:

  1. 如果沒有設置該屬性,MVC使用標準MVC資源。

  2. 如果該屬性設置爲無效類密鑰(例如資源 文件不存在),則MVC將引發異常。

  3. 如果設置了屬性並且類關鍵字存在但文件中的資源名稱不存在於應用程序中,則MVC使用標準的MVC資源 。

  4. 如果設置了屬性並且指定的資源可用,則MVC使用該文件中的資源。

如果您需要知道特定消息的關鍵值check this。對於消息值「{0}」對{1}無效。,您將需要添加一個值與密鑰DefaultModelBinder_ValueInvalid

1

我想添加另一個,在我看來,簡單的方法來添加和維護自定義錯誤消息。 使用FluentValidation NuGet包。
它與MVC配合起來很容易看看here

您可以輕鬆地爲您的模型和顯示自定義錯誤消息衆多規則,可以使用一個資源文件的例子:

public class CreateProductCommandValidator : AbstractValidator<CreateProductCommand> 
    { 
     public CreateAgendaPointCommandValidator() 
     { 
      RuleFor(cmd => cmd.price) 
       .NotEmpty() 
       .WithMessage(Translations.CreateProduct_Price) 

     } 
    } 
} 

文檔:FluentValidationDocumentation