2013-05-20 6 views
16

To pytanie zostało zadane tutaj:ASP.NET MVC: RedirectToAction z parametrami do działania po

RedirectToAction with parameter

Ale co, jeśli mam dwie akcje o tej samej nazwie, ale z różnymi parametrami? Jak przekierować do akcji POST Terms zamiast akcji GET Terms.

public ActionResult Terms() { 
    //get method 
} 

[HttpPost] 
public ActionResult Terms(string month, string year, int deposit = 0, int total = 0) { 
    //process POST request 
} 
+0

Patrzysz na RedirectToAction? – PSL

+0

http://stackoverflow.com/questions/2626179/routing-to-the-actions-w--ameame-names-but- difif-parameters –

+2

Nie można przekierować do działania post. Przekierowanie jest zawsze dostawą, więc po prostu nie jest możliwe. –

Odpowiedz

39

Nevermind chłopaki, faktycznie może po prostu wywołać metodę bezpośrednio zamiast korzystać RedirectToAction tak:

return Terms(month, year, deposit, total); 

Zamiast:

return RedirectToAction("Terms", {month, year, deposit, total}); 
+7

To jest rozwiązanie. Ale wydaje się nieco jak hack: adres w przeglądarce jest wciąż stara metoda. W ten sposób tego nie widać, ponieważ obie metody mają tę samą nazwę. Ale problem pojawia się, gdy twoja metoda z argumentami zostanie wywołana, np. "TermsPost". Co zrobić, aby uzyskać "TermsPost" (nie "Warunki") w pasku adresu przeglądarki? – pt12lol

+0

Zgadzam się z pt12lol, zachowuje on adres URL z pierwotnie nazwaną akcją. –

+0

@ pt12lol: Tutaj są dwa problemy, przeglądarka naprawdę nie musi wiedzieć, co MVC działała na stronie, RedirectToAction powinno być do wewnętrznego zarządzania programowaniem, a nie przeglądarką. – Arjang

3

masz rację, że można nazwać metoda bezpośrednio, ale zdecydowanie sugerowałbym, aby przemyśleć swoją architekturę/implementację.

Protokół HTTP obejmuje koncepcję bezpiecznych i niebezpiecznych czasowników. Bezpieczne czasowniki, takie jak GET, nie powinny w żaden sposób modyfikować stanu serwera, natomiast czasowniki Niebezpieczne, takie jak POST, PUT modyfikują stan. Przez ciebie GET wywołując metodę POST naruszasz tę zasadę, ponieważ nie jest niewyobrażalne, że twój POST będzie modyfikował stan.

Także najlepsza praktyka nakazuje ograniczyć czasowniki dla wszystkich twoich działań, więc jeśli pierwsza metoda "Warunki" ma oznaczać GET, to dodaj także atrybut HttpGet, aby zapobiec akceptacji innych akcji Http przez serwer dla akcji.

Powiązane problemy