2013-06-30 1 views
1

asp.net mvc application을 만들고 있는데 다음 호가 있습니다. 예를 들어, 나는 www.something.com/abc과 같은 생성 URL이 필요합니다. 여기서 abc는 제품 ID이고 www.something.com/def은 def는 회사 ID입니다.컨트롤러 및 동작없는 URL

누군가이 같은 경로 링크로 코드의 일부를 보여줄 수 있습니까?

이 라우팅되는 시스템

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.MapRoute(
       name: "aaaaa", 
       url: "{id}", 
       defaults: new { controller = "Home2", action = "Index2" } 
      ); 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.MapRoute(
       name: "bbbb", 
       url: "{id}", 
       defaults: new { controller = "Home3", action = "Index2" } 
      ); 
      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 

을 그리고 이러한 routelinks

@Html.RouteLink("bbbb", "aaaaa",new { id = 555 }) 
@Html.RouteLink("bbbb", "bbbb", new { id = 6666666, controller="Home3"}) 

그들 모두가 나를 리디렉션됩니다
@Html.RouteLink("Sample link 1", "routeName 1", 
    new {controller = "Home", action = "action name 1", parameter="abc" }) 

@Html.RouteLink("Sample link 2", "routeName 2", 
    new {controller = "Home", action = "action name 2", parameter="def" }) 

그냥 예를 들어, 더 내 질문에 명확하게 같은 액션 컨트롤러 home2 및 동작 Index2.

하지만 secound

먼저와 "BBBB"를 "AAAAA"를 사용 그리고 나는 또한 두 번째에서 다른 컨트롤러를 지정 할 경로를 지정했습니다.

+0

라우팅 엔진이 컨트롤러가없는 회사와 제품을 구분하는 방법은 무엇입니까? URL이 혼란스럽지 않습니까? –

+0

'www.something.com/abc'가 제품이고'www.something.com/def'가 회사 인 경우'www.something.com/ghi'는 무엇입니까? 제품인가 회사인가? –

+0

html.routelink – VirtuoZ

답변

2

당신은이 동일하게보고 URL을 가질 수 없습니다 :

는 2 개의 다른 컨트롤러 액션에 전달 될 수있다. 라우팅 엔진은 이들 사이의 모호성을 제거 할 수있는 방법이 전혀 없습니다. 이 양식의 요청이 들어 오면, 라우팅 엔진은 그들이 정의 된 순서대로 경로를 평가하고 그것이 하나와 일치 : Home2 컨트롤러가 실행되는 이유입니다

routes.MapRoute(
    name: "aaaaa", 
    url: "{id}", 
    defaults: new { controller = "Home2", action = "Index2" } 
); 

합니다. 경로 이름을 지정하고 경로를 평가할 수있는 URL을 생성하는 개념 (Html.RouteLink 도우미 사용)을 구분해야합니다.

두 URL 사이를 명확하게하려면 제약 조건을 사용해야합니다. 예를 들어 두 번째 행은 4 내지 10 자리의 ID를 허용하는 반면,이 실시 예에서

routes.MapRoute(
    name: "aaaaa", 
    url: "{id}", 
    defaults: new { controller = "Home2", action = "Index2" }, 
    constraints: new { id = @"\d{1,3}" } 
); 

routes.MapRoute(
    name: "bbbb", 
    url: "{id}", 
    defaults: new { controller = "Home3", action = "Index2" }, 
    constraints: new { id = @"\d{4,10}" } 
); 

제 경로는 1~3 자리의 ID를 받아 들인다.

+0

그러나 @Html.RouteLink ("bbbb", "bbbb", new {id = 6666666, controller = "Home3"}), "bbbb"는 경로입니까? – VirtuoZ

+0

예, 경로를 Html.RouteLink에 정의합니다. 그게 다야. 사용자가이 링크를 클릭하면 브라우저가 응용 프로그램에 GET 요청을 보냅니다. 이것이 라우팅 엔진이'http : // example.com/555 '형태의 URL을 가지고 어떤 컨트롤러 액션을 호출 할 것인지 결정해야하는 곳입니다.보시다시피이 URL에는 더 이상 경로 이름이 없습니다. 그러면 라우팅 엔진이'Home3'을 호출해야한다는 것을 어떻게 알 수있을 것이라고 생각합니까? 어떻게 대답 할 수 있겠는가? 내 대답에 설명 된대로 제약 조건을 지정하지 않는 한 그렇게 할 수 없다. 제약 조건을 지정하지 않으면 라우팅 엔진은 가장 중요한 로직을 선택합니다. –

+0

그래서 솔루션은 무엇입니까? 아니면 솔루션이 있습니까? 주된 이유는 컨트롤러 및 SEO 최적화를위한 작업을 숨기는 것입니다. ?? – VirtuoZ

관련 문제