동일한 메서드 서명으로 게시 및 가져 오기
내 컨트롤러에는 "친구"라는 두 가지 작업이 있습니다. 실행되는 것은 "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();
}
그러나 동일한 서명 (Friends)을 가진 두 가지 메서드가 있기 때문에 컴파일되지 않습니다. 이것을 만드는 방법은 무엇입니까? 액션을 하나만 생성하고 그 안에 "get"과 "post"를 구분해야합니까? 그렇다면 어떻게해야합니까?
두 번째 방법의 이름을 "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();
}
단 하나의 루틴 만 두 동사를 모두 처리하도록하려면 다음을 시도하십시오.
[AcceptVerbs("Get", "Post")]
public ActionResult ActionName(string param1, ...)
{
//Fun stuff goes here.
}
한 가지 잠재적 인주의 사항 : MVC 릴리스 2를 사용하고 있습니다. 이것이 MVC 1에서 지원되는지 확실하지 않습니다. AcceptVerbs에 대한 Intellisense 문서에서 알려줄 것입니다.
다음을 사용해보십시오.
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult Friends()
{
// do some stuff
return View();
}
그것이 올바른 방법인지 완전히 확실하지는 않지만 의미없는 매개 변수를 사용하여 시그를 구별합니다. 처럼:
// 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();
}
추악하고 끔찍하지만 작동합니다.
내 질문에 대답했기 때문에 cagdas의 응답을 대답으로 표시했습니다. 그러나 프로젝트에서 ActionName 속성을 사용하는 것을 좋아하지 않기 때문에 다른 솔루션을 사용합니다. 간단히 FormCollection을 "post"액션에 추가했습니다 (메소드 서명을 변경하게 됨).
// 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();
}
Post 메소드에 게시물에서 수신하려는 매개 변수를 추가하십시오. 아마도 다음과 같습니다.
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(string friendName, string otherField)
{
// do some stuff
return View();
}
.. 또는 다음과 같이 복잡한 유형이있는 경우 :
// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends(Friend friend)
{
// do some stuff
return View();
}
Edit: It would be preferable to use a more typed-approach to receiving the posted items, like above.
Your action methods can't be doing the same thing, otherwise there would be no need to to write two action methods. So if the semantics are different, why not use different names for the action methods as well?
For example, if you had a "delete" action method and GET just asks for confirmation, you might call the GET method "ConfirmDelete" and the POST method just "Delete".
Not sure if that matches your scenario, but it always did for me when I had the same problem.
ReferenceURL : https://stackoverflow.com/questions/724386/post-and-get-with-same-method-signature
'programing' 카테고리의 다른 글
Room에서 데이터 무결성을 확인할 수 없습니다. (0) | 2021.01.17 |
---|---|
LINQ to SQL을 사용하여 IN 하위 쿼리를 어떻게 처리 할 수 있습니까? (0) | 2021.01.17 |
활동이 시작될 때 소프트 키보드 표시 (0) | 2021.01.17 |
선택 및 선택의 어떤 값이 거짓입니까? (0) | 2021.01.17 |
원격 지점에서 병합하기 전에 실제 git diff를 확인하는 방법은 무엇입니까? (0) | 2021.01.17 |