ASP.NET MVC 수락 VERBS 및 등록 경로
-
08-07-2019 - |
문제
acceptverbs (..)] 속성으로 액션 메소드를 장식 한 경우 (경로를 등록 할 때) 경로 정의에 HTTPVERB 제약 조건을 등록해야합니까?
예를 들어. 나는 이것을 가지고있다.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{ .. }
이 조치를 제약으로 지칭하는 경로에 이것을 추가해야합니까?
해결책
둘 사이의 차이점은 다음과 같습니다. Create
문제의 메소드가 HomeController
.
사용 AcceptVerbs
속성은 라우팅에 영향을 미치지 않습니다. 실제로 Action Invoker가 사용하는 것입니다. 당신이 할 수있는 것은 각각 다른 HTTP 방법에 응답하는 동일한 이름의 컨트롤러에 2 개의 동작 메소드가 있다는 것입니다.
public ActionResult Create(int id) { .. }
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection) { .. }
그래서 요청할 때 /home/create
들어 오면 경로가 일치하고 컨트롤러의 호반에 대한 요청을 꺼냅니다. 그런 다음 Invoker는 AcceptVerbs
기인하다.
사용 HttpMethodConstraint
라우팅에서 경로 자체가 요청과 일치하지 않도록합니다. 따라서 게시물 요청이 등장 할 때 /home/create
, 해당 경로가 요청과 일치하지 않기 때문에 액션 방법은 호출되지 않습니다. 다른 경로가 가능합니다 ~ 할 것이다 그래도 그 요청과 일치합니다.
여기서 겹치는 이유 중 하나는 라우팅이 ASP.NET 3.5 SP1의 기능이며 MVC에만 국한되지 않기 때문입니다. MVC는 라우팅을 사용하지만 라우팅은 동적 데이터에서도 사용되며 라우팅을 ASP.NET 웹 양식과 통합 할 계획입니다.
다른 팁
아니 - Create는 게시물 요청에만 응답합니다.
다른 acceptverb 속성을 가진 다른 구현 또는 다른 모든 요청을 포착 할 속성이없는 다른 구현을 가질 수 있습니다.
그것이 당신의 유일한 생성 방법이라면, GET (또는 기타 비 포스트) 요청은 404를 초래할 것입니다.
나는 후드 아래에서 이것이 어쨌든 라우팅 엔진에 의해 수행된다고 가정합니다. [편집 : 아니, Haacked의 게시물 참조
먼저 다음과 같이 장식하십시오.
[ActionName("ItemEdit"), AcceptVerbs(HttpVerbs.Post)]
public virtual object ItemSave(Menu sampleInput)
그런 다음 다음과 같은 경로를 추가해야합니다.
AddRoute(
"SampleEdit",
"Admin/{sampleID}/Edit",
new { controller = "Sample", action = "ItemEdit", validateAntiForgeryToken = true },
new { areaID = new IsGuid() },
new { Namespaces = controllerNamespaces }
);