Проверка ASP.NET MVC3 работает как на стороне сервера, так и на стороне клиента.
Когда вы пишете серверный код для добавления проверочных сообщений на отображаемую страницу (как в вашем вспомогательном методе), код вызывается только тогда, когда запрос фактически отправлен на сервер, в то время как проверка на стороне клиентапри включении предотвращает отправку запроса обратно на сервер.
Реализация по умолчанию проверки на стороне клиента MVC3 работает с использованием метода, называемого ненавязчивой проверкой JavaScript, путем добавления некоторых атрибутов data-
на страницу изатем поиск и манипулирование отмеченными элементами в JavaScript.
Для понимания ненавязчивой проверки JavaScript попробуйте найти ее, там масса ресурсов.Например:
http://www.codeproject.com/KB/aspnet/CustomClientSideValidatio.aspx
В вашем случае, когда вы хотите указать, где отображать сообщение проверки, вы должны пометить элемент HTML атрибутом data-valmsg-for
.Например:
<SPAN data-valmsg-for="id_of_the_input_to_validate"></span>
JavaScript проверки будет искать вышеуказанный атрибут и заполнять SPAN
сообщением проверки в случае, если введенные данные неверны.Опять же, это происходит до обратной отправки формы, поэтому ваш серверный код, который показывает сообщение проверки, никогда не вызывается, потому что проверка не позволяет отправить форму.
Вот фрагмент кода из фактического сообщения проверкипомощник, включенный в MVC3:
TagBuilder builder = new TagBuilder("span");
...
if (htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled) {
builder.MergeAttribute("data-valmsg-for", modelName);
builder.MergeAttribute("data-valmsg-replace", replaceValidationMessageContents.ToString().ToLowerInvariant());
}
Редактировать: Ответить на ваш отредактированный вопрос:
При первом отображении страницы ваш первый if
равен true
(нет сообщений об ошибках валидации, поэтому вы возвращаете пустую строку.На вашей странице не будет ни одного атрибута data-
.
Вы должны отображать <span data-valmsg-for="..."></span>
все время, даже если у вас нет сообщений об ошибках, чтобы библиотека JavaScript знала, гдепоставить ошибку на случай, если это произойдет на стороне клиента.