2012-03-20 11 views
5

Mam listę działańMVC3 Dlaczego pojawia się komunikat "Akcje dziecka nie mogą wykonywać działań przekierowania"?

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

Zdaniem świadczymy działanie:

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

definicje akcji:

[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"); 
} 

i Dostaję: Działania dziećmi nie są dopuszczone do wykonuj wyjątek działania przekierowania za każdym razem, gdy ktoś przesyła formularz. Jestem nowy w MVC3, ale wygląda na to, że przekierowanie jest również POST, ponieważ jeśli [HttpGet] powyżej metody listy zostanie odkomentowany, "nie można odnaleźć zasobu".

Jak zmienić metodę Http podczas przekierowania lub czy robię coś nie tak? Próbowałem to Bing, ale bez powodzenia.

Odpowiedz

3

Informacje przekierowania są przechowywane w nagłówku odpowiedzi. Jednak odpowiedź jest już wysyłana po uruchomieniu akcji podrzędnej, więc nie można zapisać nagłówków.

Podsumowując, nie ma możliwości wykonania przekierowania z akcji podrzędnej innej niż poprzez użycie javascript po stronie klienta.

+0

To miałoby sens, ale przekierowanie w moim przykładzie nie jest wykonywane za pomocą adnotacji [ChildActionOnly]. Problem polega na tym, że gdy [HttpPost] UpdateSearch przekierowuje do listy, przekierowuje z POST, stąd metoda [HttpPost] jest (próbuje być) używana do częściowego generowania w widoku. Czy mogę użyć RouteValueDictionary, aby to zmienić? –

+0

Pokaż nam również zawartość widoku częściowego. Problem prawdopodobnie leży w błędnej definicji trasy w BeginForm, ale nie mogę powiedzieć, nie widząc widoku. –

+2

Masz rację. Aby go naprawić, wystarczy dodać parametr działania metody BeginForm zdaniem UpdateSearch (GET, wersja dla dzieci), więc zmiana z: /@ using (Html.BeginForm()) { do: /@ przy użyciu (Html.BeginForm ("UpdateSearch")) { naprawiono problem. Czy jesteś w stanie wyjaśnić, dlaczego? –

Powiązane problemy