2013-05-20 4 views
16

Этот вопрос был задан здесь:ASP.NET MVC: RedirectToAction с параметрами для POST действий

RedirectToAction with parameter

Но что, если у меня есть два действия с тем же именем, но с разными параметрами? Как перенаправить действие POST Terms вместо действия 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

Вы смотрите на RedirectToAction? – PSL

+0

http://stackoverflow.com/questions/2626179/routing-to-the-actions-with-same-names-but-different-parameters –

+2

Вы не можете перенаправить на пост-действие. Переадресация всегда получается, так что это просто невозможно. –

ответ

39

Nevermind ребята, на самом деле я мог бы просто вызвать метод непосредственно, вместо использования RedirectToAction так:

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

Вместо:

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

Это решение. Но это похоже на хак: адрес в браузере все еще старый метод. Таким образом, вы не можете видеть это, потому что оба метода имеют одно и то же имя. Но проблема возникает, когда ваш метод с аргументами будет называться i.e. «TermsPost». Что делать, чтобы получить «TermsPost» (а не «Условия») в адресной строке браузера? – pt12lol

+0

Согласен с pt12lol, он сохраняет URL-адрес с первоначально вызванным действием. –

+0

@ pt12lol: здесь есть два вопроса: браузеру действительно не нужно знать, из какого действия MVC появилась страница, RedirectToAction должен быть для внутреннего программирования, а не для браузера. – Arjang

3

Вы правы, что вы можете позвонить метод, но я настоятельно рекомендую вам пересмотреть свою архитектуру/реализацию.

Протокол HTTP охватывает идею безопасного и небезопасного глагола. Безопасные глаголы, такие как GET, не предполагают каким-либо образом модифицировать состояние сервера, в то время как небезопасные глаголы, такие как POST, PUT, изменяют состояние. Вы, GET, вызываете метод POST, вы нарушаете этот принцип, так как не исключено, что ваш POST будет изменяться.

Также наилучшая практика диктует, что вы должны ограничивать глаголы во всех своих действиях, поэтому, если первый метод «Термины» подразумевается как GET, тогда также добавьте к нему атрибут HttpGet, чтобы другие действия Http не принимались сервер для действия.

Смежные вопросы