MVC3 Почему я получаю, что дочерним действиям не разрешено выполнять действия перенаправления?

У меня есть список действий

    //[HttpGet] (will come back to that!)
    public ViewResult List(int page = 1)
    {
        //blah blah blah
        return View(viewModel);
    }

В его представлении мы оказываем действие:

@{        
    Html.RenderAction("UpdateSearch");
}

Определения действий:

[ChildActionOnly]
[HttpGet]
public PartialViewResult UpdateSearch()
{
    // do something and display a form in view
    return PartialView(so);
}

[HttpPost]
public RedirectToRouteResult UpdateSearch(Options searchOptions)
{
    // do something and redirect to List
    return RedirectToAction("List");
}

и я получаю: дочерним действиям не разрешено выполнять исключение действий перенаправления каждый раз, когда кто-то отправляет форму. Я новичок в MVC3, но похоже, что перенаправление также является POST, потому что, если [HttpGet] над методом List раскомментирован, происходит «ресурс не может быть найден».

Как изменить метод Http при перенаправлении или я что-то не так делаю? Я пытался использовать Bing, но безуспешно.


person Mariusz.W    schedule 20.03.2012    source источник


Ответы (1)


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

Короче говоря, нет другого способа выполнить перенаправление из дочернего действия, кроме как с помощью javascript на стороне клиента.

person Vilém Procházka    schedule 20.03.2012
comment
Это имело бы смысл, но перенаправление в моем примере не выполняется методом с аннотациями [ChildActionOnly]. Проблема в том, что когда [HttpPost] UpdateSearch перенаправляется на список, он перенаправляется с помощью POST, поэтому метод [HttpPost] (пытается использовать) для частичной генерации в представлении. Могу ли я использовать RouteValueDictionary, чтобы изменить его? - person Mariusz.W; 20.03.2012
comment
Покажите нам также содержимое частичного представления. Проблема, вероятно, заключается в неправильном определении маршрута в BeginForm, но я не могу сказать, не видя представления. - person Vilém Procházka; 20.03.2012
comment
Ты прав. Чтобы исправить это, достаточно добавить параметр действия в метод BeginForm в представлении UpdateSearch (Get, дочерняя версия), поэтому изменение с: /@using (Html.BeginForm()) { на: /@using (Html.BeginForm(UpdateSearch )) { исправил проблему. Вы можете объяснить, почему? - person Mariusz.W; 20.03.2012
comment
BeginForm без параметров относится к текущему маршруту основного действия, а не к дочернему действию. Поэтому произошло то, что метод UpdateSearch(Options searchOptions) был вызван как дочернее действие. - person Vilém Procházka; 20.03.2012