ASP.NET MVC에서 동일한 컨트롤러 작업에 대한 GET 및 POST


91

한 번의 작업으로 Get과 Post에 모두 응답하고 싶습니다. 나는 다음을 시도했다

[HttpGet]
[HttpPost]
public ActionResult SignIn()

작동하지 않는 것 같습니다. 어떤 제안?


2
문제를 설명하려면 : 작업이 무시됩니다. 각 속성은 다른 모든 요청 메서드를 제외하므로 작업은 요청 메서드를 전혀 수락하지 않습니다.
Guffa 2011

ASP.NET MVC2 및 VisualStudio 2010에서 OP의 예제 ( "[AcceptVerbs (HttpVerbs.Get)]"등 사용)는 컴파일 오류 : "Duplicate 'AcceptVerbs'attribute"를 제공합니다.
DaveD

4
@ 데이브 당신은하고 있습니까 [AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)][AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]? 나는 그 속성에 대해 아무것도 모르지만 두 번째를하고 있다면 그 오류가 발생할 수 있습니다.
자레드

답변:


134

AcceptVerbs 속성을 사용하면 가능합니다. 좀 더 장황하지만 더 유연합니다.

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}

msdn에 대해 자세히 알아보십시오 .


3
예,하지만 메서드가 매개 변수 (예 : SignIn (SingInParams parameters) ... GET의 경우 URI에서 가져오고 (따라서 [FromUri]를 지정해야 함)) POST의 경우 본문에서 가져옵니다 (따라서 [ ? FromBody])을 지정해야합니다
michal.jakubeczy

64

작업은 기본적으로 GET과 POST 모두에 응답하므로 아무것도 지정할 필요가 없습니다.

public ActionResult SignIn()
{
    //how'd we get here?
    string method = HttpContext.Request.HttpMethod;
    return View();
}

필요에 따라 HttpContext.Request.HttpMethod 값을 조작하여 HttpMethod에 따라 다른 논리를 수행 할 수 있습니다.


5
뷰 모델을 사용하기 전까지는 괜찮습니다! 게시 작업에서 일반적으로 viewmodel에서 전달하는 경우 선택적 매개 변수를 사용하고 기본값을 null로 설정했지만 작동하지 않습니다.
JBeckton 2011 년

1
@JBeckton 일반적으로 쿼리 문자열 매개 변수 만 SignIn(Guid? UserId)있고 POST에는 뷰 모델이 SignIn(SomeVM vm)있고 둘 다 공유 개인 메서드를 호출하는 SignInHandleGetPost(...)GET 메서드가 있습니다. 이는 GET 메서드가 초기화해야하는 VM 또는 선택적 매개 변수 또는 원하는대로 수행 할 수 있습니다. ruseable / shared 코드를 리팩토링하기 위해.
AaronLS apr

2
@JBeckton 방금 ASP.NET MVC 4.6.1 샘플 프로젝트에서 방법을 사용하여 시도했는데 AccountController.Login(String returnUrl, LoginViewModel model)제대로 작동합니다. modelGET에서는 null이고 POST에서는 null이 아닙니다. 그러나 GET 요청에서 예외가 발생 [ValidateForgeryToken]하므로 재정의해야 ValidateForgeryToken합니다.
Dai

0
[HttpGet]
public ActionResult SignIn()
{
}

[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}

그것은 내가 찾고있는 것이 아니라, 함수 오버로딩을 통해 GET과 POST를위한 별도의 메서드를 갖는 기본 MVC 구현입니다. 저는 MVC를 처음 접하는 사람이 아니며 GET 작업이 양식 컬렉션에 대한 표준 POST 작업 외에도 특정 POST 이벤트에 응답하도록 노력하고 있습니다.
Cranialsurge 2010-07-12

그런 다음 Kurts의 대답을 따라야합니다. 둘 다 처리하는 속성은 없습니다. POST 요청이 다른 작업으로 이동하도록 시도하는 경우 불가능합니다. 당신의 행동은 당신이 찾고있는 전환을 수행해야 할 것입니다.
Jeremy B.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.