2010-06-29 2 views
3

ASP.NET MVC 2 컨트롤러 및 작업은 UpperCamelCase를 사용합니다.ASP.NET MVC2에서 소문자 URL ('questions/add_to_favorites/123')을 밑줄로 묶는 방법은 무엇입니까?

몇 가지 이유로 SO를 비롯한 많은 대형 사이트는 URL의 컨트롤러 및 동작에 소문자 (밑줄 표시)를 사용합니다. 예 :

https://stackoverflow.com/questions 
https://stackoverflow.com/users/377920/randomguy 
http://www.reddit.com/ad_inq/ 
http://www.wired.com/special_multimedia/mobile/ 
etc. 

이 작업이 어떻게 수행되는지 알고 싶습니다.

기본 라우터는 대소 문자를 구분하지 않습니다. stackoverflow.com/questions/ask은 문제없이 질문 컨트롤러의 Ask() 메소드로 이동합니다.

그러나 질문 컨트롤러의 AddToFavorites() 작업에 questions/add_to_favorites을 보내려고한다고 가정 해 보겠습니다.

  1. 어떻게 처리 할 수 ​​있습니까?
  2. Html.ActionLink("AddToFavorites") 대신 Html.ActionLink("add_to_favorites") 을 사용하여 Questions/AddToFavorites 대신 questions/add_to_favorites으로 HTML 지점의 링크를 만들 필요가 있습니까?

편집 :

: 유사 게시물

밑줄을 지원하는

한 가지 방법은 ActionName 속성을 사용하는 것입니다

그러나 컨트롤러에서는 작동하지 않습니다. 아마도 라우팅 메커니즘에 도달하기 전에 모든 밑줄을 요청에서 제거 할 수 있다면 작동 할 수 있습니다.

+0

빠른 쪽지. 'add_to_favorite'가 POST를 필요로하는지 확인하십시오. GET 요청은 서버의 상태를 수정해서는 안됩니다. – Earlz

+0

동의! 이것은 RESTful 주부만을위한 것이 아닙니다. 국가 변경 GET 요청은 보안 허점을 만듭니다. 하지만 인증을 강제하고 사이트 간 요청 위조 (AntiForgeryToken 사용)를 방지하는 경우 GET'ing이 기술적으로 문제가 있다고 생각하지 않습니다. – randomguy

+0

그리고 단순히 [HttpPost]를 추가해도 보안 문제가 해결되지 않습니다. 악의적 인 사람은 단순히 양식 게시글을 모방 할 수 있습니다.따라서 POST (또는 AJAX에서 DELETE/PUT)를 강요하더라도 여전히 조심해야합니다. – randomguy

답변

2

사용자 지정 경로를 수동으로 추가 할 수 있습니다. 이것은 보편적 인 솔루션이 아니며 모든 컨트롤러와 작업마다 별도로 추가해야합니다.

routes.MapRoute(
    "Web2.0 RoR style lowercase URLs with underscores", 
    "questions-foo/add_to_favorites", 
    new { controller = "Questions", action = "AddToFavorites" } 
); 

멋진 점은 HTML 도우미 메서드를 생성하는 URL을 수정할 필요가 없다는 것입니다. 라우팅 테이블은 들어오는 요청 을 라우팅하여 URL을 생성하는 데 사용됩니다. 따라서

Html.ActionLink("Add to favorites", "Questions", "AddToFavorites");/questions-foo/add_to_favorites에 매핑됩니다.

원래의 /Question/AddToFavorites은 기본 라우팅 메커니즘이 대/소문자를 구분하지 않으므로 /qUeStIoN/aDdtOfAvOrItEs과 마찬가지로 /qUeStIoNs-FOO/ADD_TO_FAVORITES처럼 여전히 작동합니다.