Вы не говорите, что это за ошибки, которые не отображаются, но есть некоторые ошибки, которые будут отображаться в ValidationMessage, но не в ValidationSummary. Я думаю, что это ошибка в Release Candidate, но я открыт для других интерпретаций. В частности, рассмотрим эту строку из исходного кода ValidationSummary:
string errorText = GetUserErrorMessageOrDefault(modelError, null /* modelState */);
Обратите внимание, что для modelState ничего не передается. Теперь сопоставьте это с ValidationMessage:
... GetUserErrorMessageOrDefault(modelError, modelState) ...
Наконец, давайте посмотрим на GetUserErrorMessageOrDefault:
private static string GetUserErrorMessageOrDefault(ModelError error, ModelState modelState) {
if (!String.IsNullOrEmpty(error.ErrorMessage)) {
return error.ErrorMessage;
}
if (modelState == null) {
return null;
}
string attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null;
return String.Format(CultureInfo.CurrentCulture, MvcResources.Common_ValueNotValidForProperty, attemptedValue);
}
Это говорит нам о том, что если вы укажете специальное сообщение об ошибке при добавлении ошибки в состояние модели, оно будет отображаться. Однако, если добавлено исключение (существует одна перегрузка для AddModelError, которая принимает исключение, другая - для строки; реализация IDataErrorInfo работает как строковый регистр) вместо сообщения об ошибке строки, оно будет отображаться только в том случае, если для ModelState не нулевое, и тогда мы выдадим вам общее сообщение вместо сообщения об ошибке в исключении.
Обновление
Использует ли ValidationSummary ErrorMessage, а ValidationMessage - InnerException.Message?
Да, это более или менее эффект. Как я уже сказал, я думаю, что это ошибка.
Update2
Microsoft обновила функцию GetUserErrorMessageOrDefault, как показано здесь .
private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState)
{
if (!String.IsNullOrEmpty(error.ErrorMessage))
{
return error.ErrorMessage;
}
if (modelState == null)
{
return null;
}
string attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null;
return String.Format(CultureInfo.CurrentCulture, GetInvalidPropertyValueResource(httpContext), attemptedValue);
}