Я не знаю лучших практик, но могу рассказать вам, что я делал в недавнем проекте. По сути, я определил интерфейс для всех результатов сохранения JSON, который называется IJSONValidationResult. Этот интерфейс состоял из двух свойств: bool IsValid, указывающего, было ли сохранение / действие действительным, и список ошибок. Класс был заполнен ошибками проверки ModelState.
Чем я использовал javascript на стороне клиента, чтобы проанализировать результат JSON и сделать соответствующие обновления на странице. Например, если это было допустимо, чем перенаправить со страницы редактирования на страницу списка, показывающую сохраненный результат, или если были ошибки, показать их пользователю в ранее скрытом div.
Ничего особенного, но это было низко над головой и довольно прямолинейно.