Подтвердить что ты не робот

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

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

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

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

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

Спасибо

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Мое решение.

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

return View("Redirect", model);

Вид:

<script type="text/javascript" language="javascript">
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script>

Ответ 4

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

Ответ 5

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

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

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 ..

Ответ 6

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

ActionResult X
    Return View
View X
    RenderAction Y

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

Ответ 7

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