2009-04-07 4 views
47

내 컨트롤러에는 "친구"라는 두 가지 작업이 있습니다. 실행되는 것은 "get"대 "post"인지 여부에 달려 있습니다.게시하고 동일한 메소드 서명으로 가져 오기

그래서 내 코드 조각은 다음과 같이 보일 : 나는 동일한 서명 (친구)와 두 가지 방법이 있기 때문에

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

그러나,이 컴파일되지 않습니다. 어떻게 이것을 만들까요? 하나의 액션을 만들어야하지만 그 안에 "get"과 "post"를 구별해야합니까? 그렇다면 어떻게해야합니까?

답변

106

두 번째 방법의 이름을 "Friends_Post"와 같은 이름으로 바꾸고 두 번째 방법에 [ActionName("Friends")] 특성을 추가 할 수 있습니다. 따라서 요청 유형으로 POST가있는 Friend 작업에 대한 요청은 해당 작업에 의해 처리됩니다.

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[ActionName("Friends")] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends_Post() 
{ 
    // do some stuff 
    return View(); 
} 
+7

MVC 2.0'[AcceptVerbs (HttpVerbs입니다.(Get Get)]''[HttpGet]'로 단축 할 수 있습니다. 다른 REST 메소드에서도 마찬가지입니다. – nimrod

2

정확한 방법인지는 모르겠지만 의미없는 매개 변수를 사용하여 신호를 구분합니다. like :

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends(bool isGet) 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

나는 못 생기고 해킹 당하다는 것을 알고 있지만 작동합니다.

2

내 질문에 대한 답변으로 cagdas의 응답을 대답으로 표시했습니다. 그러나, 나는 내 프로젝트에서 ActionName 속성을 사용하는 것을 좋아하지 않기 때문에 나는 다른 해결책을 사용한다. 나는 단순히

// Get: 
[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
} 

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(FormCollection form) 
{ 
    // do some stuff 
    return View(); 
} 
+0

게시 된 항목을 수신하는 데보다 형식화 된 접근 방식을 사용하는 것이 좋습니다. - –

1

가 PARAMS이 게시물에 수신 할 수있는 Post 메소드에 추가 (메소드 서명을 변경 끝)은 "포스트"행동에 FormCollection을 추가했습니다.

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(Friend friend) 
{ 
    // do some stuff 
    return View(); 
} 

편집 :이 같은 복잡한 유형이있는 경우

// Post: 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Friends(string friendName, string otherField) 
{ 
    // do some stuff 
    return View(); 
} 

.. 또는 : 어쩌면이 같은 수신에 더 입력-접근 방법을 사용하는 것이 바람직 할 것을 게시 같은 항목입니다. 당신이 진정으로 만 모두 동사를 처리하기 위해 하나의 루틴을 원하는 경우

16

,이 시도 :

[AcceptVerbs("Get", "Post")] 
public ActionResult ActionName(string param1, ...) 
{ 
//Fun stuff goes here. 
} 

하나의 잠재적주의 :이 MVC 1. 인텔리 지원되었다 있는지 확실하지 않습니다 MVC 릴리스 2를 사용하고 있습니다 AcceptVerbs에 대한 문서를 알려 주어야합니다.

+3

[AcceptVerbs ("Get", " Post ")]는 생성자가 AcceptVerbsAttribute (params string [] verbs)로 정의되었으므로 작동해야합니다. 깔끔하게 보입니다. – jamiebarrow

+0

고마워요! 나는 그것을 더 좋아한다. – mohrtan

0

당신의 행동 방법은 똑같은 일을 할 수 없습니다. 그렇지 않으면 두 가지 행동 방법을 쓸 필요가 없습니다. 따라서 의미가 다른 경우에는 작업 메서드에 다른 이름을 사용하는 것이 좋습니다.

예를 들어 "삭제"작업 방법이 있고 GET이 확인을 묻는 경우 GET 메서드 "ConfirmDelete"를 호출하고 POST 메서드는 "삭제"를 호출 할 수 있습니다.

시나리오와 일치하는지 확실하지는 않지만 동일한 문제가있을 때는 항상 저에게 도움이되었습니다. 사용

4

시도 :

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 
public ActionResult Friends() 
{ 
    // do some stuff 
    return View(); 
}