ASP.NET MVC를 사용하여 여러 매개 변수를 사용하여 라우팅


139

우리 회사는 제품 용 API를 개발 중이며 ASP.NET MVC 사용을 고려하고 있습니다. API를 디자인하는 동안 사용자는 다음과 같은 호출을 사용하여 사용자가 API에서 XML 형식으로 정보를 요청하기로 결정했습니다.

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&api_key=b25b959554ed76058ac220b7b2e0a026

보시다시피 여러 매개 변수가 전달됩니다 (예 : artistapi_key). ASP.NET MVC에서 artistcontroller, getImages행동을하지만, 어떻게 작업에 여러 매개 변수를 전달하는 것?

위의 형식을 사용하여 가능합니까?

답변:


279

매개 변수는 조치 메소드에 매개 변수를 추가하여 MVC에서 직접 지원됩니다. 다음과 같은 조치가 제공됩니다.

public ActionResult GetImages(string artistName, string apiKey)

MVC는 다음과 같은 URL이 주어지면 매개 변수를 자동으로 채 웁니다.

/Artist/GetImages/?artistName=cher&apiKey=XXX

또 다른 특별한 경우는 "id"라는 매개 변수입니다. ID라는 매개 변수는 쿼리 문자열이 아닌 경로에 넣을 수 있습니다.

public ActionResult GetImages(string id, string apiKey)

다음과 같은 URL로 올바르게 채워집니다.

/Artist/GetImages/cher?apiKey=XXX

또한보다 복잡한 시나리오가있는 경우 MVC가 작업을 찾는 데 사용하는 라우팅 규칙을 사용자 지정할 수 있습니다. global.asax 파일에는 사용자 정의 할 수있는 라우팅 규칙이 포함되어 있습니다. 기본적으로 규칙은 다음과 같습니다.

routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

같은 URL을 지원하려면

/Artist/GetImages/cher/api-key

다음과 같은 경로를 추가 할 수 있습니다.

routes.MapRoute(
            "ArtistImages",                                              // Route name
            "{controller}/{action}/{artistName}/{apikey}",                           // URL with parameters
            new { controller = "Home", action = "Index", artistName = "", apikey = "" }  // Parameter defaults
        );

및 상기 제 1 예와 같은 방법.


1
.NET 4 및 MVC로 작업하고 있습니다. 경로에서 하나의 매개 변수 만 전달할 수 있습니다. 이 URL {controller} / {action} / {artistName} / {apikey}는 2 개의 매개 변수에 매핑되지 않지만 404 오류를 유발합니다. 내가 알 수있는 한 경로에서 하나의 매개 변수 만 전달할 수 있습니다. 내가 뭘 잘못하고 있죠?
DavidHyogo

1
@DavidHyogo-나는 같은 문제가 발생했습니다. 어떤 이유로 든 기본 작업을 지정했지만 컨트롤러와 매개 변수뿐만 아니라 html 링크에 원하는 작업을 실제로 넣어야했습니다.
Shaggy13spe

5
@DavidHyogo : 동일한 문제가 발생하여 경로 템플릿 매개 변수가 {controller} / {action} / {artistName} / {apikey}로 정의 된 경로와 같은 동작 메소드 매개 변수 이름과 정확히 일치해야한다는 것을 발견했습니다. public ActionResult MyMethod (string artistName, string apikey)
Sudhanshu Mishra

6
또한 URL이 사용자 지정 경로에 도달하기 전에 기본 경로에 걸리지 않도록하십시오. 정의한 방식에 따라 첫 번째 일치 항목을 사용합니다. 필자의 경우 기본 색인에 "MyController / {year} / {month}"경로를 사용하려고했지만 {controller} / {action} / {id} 경로가 내 URL과 일치했습니다 (MyController / 2015 / 04), 2015라는 이름의 작업이 없기 때문에 404를 얻었습니다. 내 사용자 지정 경로를 맨 위로 이동하면 문제가 해결되었습니다.
Sam

routeconfig의 매개 변수 이름이 내 동작 서명과 일치하지 않아 작동하지 않는 이유는 @dotnetguy에 설명 된 단계를 수행 한 것입니다.
pepitomb

26

MVC 5부터는 속성 라우팅을 사용하여 URL 매개 변수 구성을 컨트롤러로 이동할 수 있습니다.

자세한 내용은 여기에서 볼 수 있습니다 : http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

요약:

먼저 속성 라우팅을 활성화합니다

 public class RouteConfig 
 {
     public static void RegisterRoutes(RouteCollection routes)
     {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

         routes.MapMvcAttributeRoutes();
     } 
 }

그런 다음 속성을 사용하여 매개 변수 및 선택적으로 데이터 유형을 정의 할 수 있습니다.

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)


21

쿼리 문자열을 통해 임의의 매개 변수를 전달할 수 있지만 RESTful 방식으로 처리하도록 사용자 지정 경로를 설정할 수도 있습니다.

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&
                                  api_key=b25b959554ed76058ac220b7b2e0a026

그럴 수 있습니다 :

routes.MapRoute(
    "ArtistsImages",
    "{ws}/artists/{artist}/{action}/{*apikey}",
    new { ws = "2.0", controller="artists" artist = "", action="", apikey="" }
    );

따라서 누군가 다음 경로를 사용한 경우 :

ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/

querystring 예제와 같은 위치로 가져갈 것입니다.

위의 예는 단지 예일 뿐이며 사람들이 URL을 '해킹'하지 않도록하기 위해 설정해야하는 비즈니스 규칙 및 제약 조건을 적용하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.