2011-06-24 61 views
4

是否可以將值傳遞給錯誤消息。我已經試過這樣的事情:如何使用流暢驗證將值傳遞給錯誤消息

RuleFor(x => x.ForeName).Length(1, 255).WithLocalizedMessage(() => String.Format(ValidationErrors.TooLong, "255")); 

ValidationErrors是我的資源文件,其中包含:

TooLong請使用超過{0}個字符。

此:

RuleFor(x => x.ForeName).Length(1, 255).WithLocalizedMessage(() => ValidationErrors.TooLong); 

工作正常。

回答

6

使用當前發佈的FluentValidation(v2)版本時,在使用本地化消息時不支持此功能。

WithLocalizedMessage的第一個參數必須始終標識資源屬性 - 不能在其中放置任意代碼(例如對string.format的調用)。

如果您使用非本地化的消息,那麼你可以這樣做:

RuleFor(x => x.Property).Length(1,255).WithMessage("Max number of chars is {0}", "255"); 

您也可以使用這種方法與本地化錯誤消息作爲FluentValidation V3的,但有沒有二進制發佈,所以如果你想利用這個,那麼你可以從項目網站抓取和構建源代碼。

作爲一種替代方法,您可以使用FV內置的對默認驗證器的命名佔位符的支持,而不是使用數字佔位符。所以,如果你使用。長度(1,255),那麼你可以使用{}的MaxLength您的錯誤消息中,而不是{0}:

請使用比{}的MaxLength較少的字符。

... FV將自動用您輸入的最大值替換它。有所有指定佔位符的完整列表in the documentation

+0

謝謝。我猜這樣的東西不會是一個解決方案:RuleFor(x => x.ForeName).Length(1,255).WithMessage(String.Format(ValidationErrors.TooLong,「255」)); – cs0815

+1

問題在於它強制在構建規則時查找本地化的消息。這*可能*在某些情況下工作,但如果您正在緩存驗證器(例如,使用IoC容器),這是推薦的行爲(由於性能),那麼具有不同文化的用戶可能以錯誤的語言結束消息。 WithLocalizedMessage緩存資源類型和資源名稱,每次需要消息時都會強制重新查找。 –