Могу ли я вернуть JsonResult из действия MVC и при этом воспользоваться преимуществами проверки?

На самом деле я еще не пробовал это и надеялся на быстрый ответ да или нет.

Я только узнаю об использовании JSonResult из полезного вопроса о стеке. .

Мне было интересно, могу ли я использовать такой результат действия, но при этом воспользоваться преимуществами подтверждение предоставлено моделью MVC?

Если я возвращаю результат Json и возникает ошибка проверки, будет ли он просто автоматически возвращать другой тип результата, который захвачен логикой проверки ajax?


person Simon_Weaver    schedule 27.01.2009    source источник


Ответы (3)


Сообщения проверки по умолчанию создаются, когда вы выполняете привязку ModelBind (т. е. берете данные запроса и применяете их к объекту). Это можно сделать с помощью стандартной отправки формы, ajax или любым другим способом.

Сообщения проверки хранятся в ViewData.ModelState.

Отображение сообщений проверки выполняется с помощью HtmlHelpers, которые просто просматривают ModelState и отображают любые применимые сообщения. HtmlHelpers выполняются на стороне сервера как часть рендеринга представления. Возврат JSON пропускает рендеринг. Вместо этого вы можете вернуть частичное представление, которое будет отображать любые сообщения проверки, являющиеся частью пользовательского элемента управления.

Тем не менее, если ваша модель действий контроллера связывается и возвращает JSON, она все равно будет генерировать правильную информацию для проверки в ViewData.ModelState. Информация есть, если вы хотите ее использовать, но ее нужно переместить в вашу модель, и ваш javascript-код на стороне клиента должен знать, что с ней делать.

person anonymous    schedule 27.01.2009
comment
так что нет ничего автоматического. я в порядке, я просто хотел убедиться, что не было чего-то умного для возврата ошибок проверки через JSON. - person Simon_Weaver; 28.01.2009

Что я сделал, так это написал свой собственный класс ExtendedJsonResult, который наследуется от JsonResult, изначально для того, чтобы добавить возможность регистрировать JavaScriptConverters в процессе сериализации, но позже это позволило мне добавить метод CheckContextForErrors, который просматривает ошибки модели в контексте и добавляет и ошибки в данных результата json (имя свойства, значение попытки, сообщение).

Я реализовал свой собственный класс HandleJsonErrorInfo (на основе HandleErrorInfo) и HandleJsonErrorAttribute, который объявляется в действиях, которые будут перехватывать любые необработанные исключения и возвращать сообщения об исключениях в виде JSON.

На стороне клиента я могу проверить, существует ли массив ExceptionMessages в ответе JSON, а затем выполнить итерацию по каждой ошибке.

person Luke Smith    schedule 27.01.2009
comment
Ницца. [HandleError] был в моем списке вещей, о которых нужно было узнать (stackoverflow.com/questions/183316). Кажется умным решением. Мне просто не было ясно, есть ли встроенный механизм для возврата ошибок JSON. Раньше я использовал JSON, поэтому я даже не знал, существует ли соглашение об ошибках или нет. - person Simon_Weaver; 28.01.2009

Нет, встроенный JsonResult просто сериализует объект, переданный Json, и отправляет его по сети. Если вы хотите отправлять ошибки проверки, вам придется поместить эту информацию в свои собственные объекты и отправить их через Json.

person Andrew Stanton-Nurse    schedule 27.01.2009
comment
так что все функции модели проверки работают только с Form.Begin(...), верно? - person Simon_Weaver; 27.01.2009
comment
Не совсем. Вы можете отображать сообщения проверки без формы. Информация об отображении проверки хранится в ViewData.ModelState. HtmlHelpers, которые вы используете для проверки, просто смотрят на этот объект для рендеринга и не требуют, чтобы он находился внутри формы. - person anonymous; 27.01.2009