Почему результаты Redirect не разрешены в дочерних действиях в Asp.net MVC 2

У меня есть частичные действия, которые я выполняю с помощью метода Asp.Net Futures RenderAction. Некоторые из них выполняют перенаправления после обработки форм в них.

Теперь, когда я обновился до Asp.Net MVC 2 RC, он дал мне ошибку «Действиям с детьми не разрешено выполнять действия перенаправления».

Я проверил исходный код, и я нашел строку, которая выдает исключение. Чтобы обойти это, я могу создать пользовательский RedirectResult, но прежде чем я это сделаю, я хочу понять, почему инфраструктура не позволяет это в первую очередь. Должна быть веская причина, и, может быть, я не должен этого делать.

Кто-нибудь знает причину этого ограничения?

благодаря

Ограничение существует, потому что MVC уже начал визуализацию представления клиенту. Эффект перенаправления из этой точки не определен. Он может работать отлично, он может продолжать рендеринг исходного вида без перенаправления, он может генерировать другое исключение и т. Д.

Поскольку результат выполнения этого действия не определен, структура блокирует его. На практике RenderAction никогда не следует использовать для создания чего-либо иного, кроме представления (или подобного виду) по тем же причинам.

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

Попробуйте использовать что-то вроде этого в Child Action:

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString()); 

Мое решение.

Метод действия:

 return View("Redirect", model); 

Посмотреть:

  

В моем случае отображаемая форма представляет собой панель «configure» на расширении для веб-сайта, который я создаю. Я бы хотел, чтобы собственный controller расширения мог обрабатывать обработку формы, а затем перенаправлять обратно на страницу администрирования со списком всех настроенных расширений. Я не думаю, что здесь целесообразно или практично просить controller родительской страницы обрабатывать форму для расширения. Что бы вы предложили вместо этого?

В моем необычном случае у меня был специальный атрибут AuthorizeAttribute, прикрепленный к моим controllerам, который пытался перенаправить на дочернее действие, которое (как упоминалось выше) не разрешено.

Чтобы устранить проблему, я удалил redirect проверки полномочий на все дочерние действия:

 Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext) //Child actions cannot redirect anyway, so no need to check permissions. If filterContext.IsChildAction Then Exit Sub .. parent authorisation checks .. 

Иногда эта ошибка возникала при попытке выполнить действие базового результата. Пример:

 ActionResult X Return View View X RenderAction Y ActionResult Y // Bla bla return View // else return RedirectToAction X 

В этом случае просто укажите URL-адрес представления частичной формы представления, который был целью вашего проблемного перенаправления, и пусть он выполняет redirect к своей версии GET.

  • Существуют ли алгоритмы обнаружения сообщества на графиках?
  • «Const correctness» в C #
  • Что такое lambda (функция)?
  • Где я могу начать изучать обработку изображений и распознавание объектов?
  • Существуют ли какие-либо O (1 / n) алгоритмы?
  • Давайте будем гением компьютера.