Почему результаты перенаправления не разрешены в дочерних действиях в Asp.net MVC 2 - PullRequest
22 голосов
/ 13 января 2010

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

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

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

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

Спасибо

Ответы [ 7 ]

35 голосов
/ 14 января 2010

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

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

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

17 голосов
/ 26 марта 2011

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

ControllerContext.HttpContext.Response.Redirect(ControllerContext.HttpContext.Request.Url.ToString());
13 голосов
/ 15 февраля 2011

Мое решение.

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

return View("Redirect", model);

Вид:

<script type="text/javascript" language="javascript">
    document.location = '<%: Url.Action("Index", "Album", new { id = Model.Id }) %>';</script>
6 голосов
/ 29 января 2010

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

5 голосов
/ 18 октября 2013

В моем необычном случае к моим контроллерам был прикреплен пользовательский атрибут 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 ..
3 голосов
/ 20 января 2011

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

ActionResult X
    Return View
View X
    RenderAction Y

ActionResult Y
    // Bla bla
       return View 
    // else
       return RedirectToAction X
1 голос
/ 18 января 2010

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

...