2011-01-20 2 views
4

두 가지 질문이 있습니다. 저는 MVC에 상당히 익숙하며 컨트롤러와 뷰가 설정된 새로운 방식을 좋아하지만 다음과 같은 작업을 수행하는 방법을 이해할 수 없습니다.asp mvc 컨트롤러 이름과 라우팅에 대시를 사용 하시겠습니까?

1) www.homepage.com/coming과 같은 URL을 만듭니다. -soon

이 유형의 URL의 경우 올바른 방법은 무엇입니까? ComingSoonController라는 컨트롤러를 만들고 마술처럼 라우팅을 통해 대시를 삽입합니까? 내가 SEO의 이익을 위해 최선을 다하지 않기 때문에 밑줄을 사용하지 마십시오. 또는 URL에 없으며 [ActionName ("name-with-dash")] 속성을 사용하는 다른 컨트롤러에서 곧 일부 작업 이름이 올 것입니까?

2) facebook, linkedin 및 twitter는 www.facebook.com/ [프로필 이름]과 같은 URL을 가지고 있습니다. 이것이 MVC에서 어떻게 이루어질 것인가? 분명히 [프로필 이름]은 동적입니다. 코드는 분명히 프로파일이라고하는 컨트롤러에 존재합니다. 그래서 MVC는 URL의 두 번째 부분이 프로필 이름이고 컨트롤러가 아닌 것을 알기에 충분히 똑똑하게 만들어야하고 프로필 컨트롤러의 올바른 동작으로 라우트해야합니다. 이것이 소리보다 쉬운가요?

답변

3

1) 출시 예정이 동적 부품인지 여부에 따라 다릅니다. 나는 그것이 가정 것이다이 같은 제안 :

Global.asax에 당신은 내가 위에서 보여준 것처럼이 같은 방법으로 해결할 수 있습니다

public static void RegisterRoutes(RouteCollection routes) 
{ 
routes.MapRoute(
       "Page", // Route name 
       "{pageName}", // URL with parameters 
       new { controller = "Home", action = "Page"} // Parameter defaults 
      ); 

} 

public class HomeController : Controller 
{ 

public ActionResult Page(string pageName) 
{ 
    return View(); 
} 
} 

2), 그러나 것을 명심 경로의 순서 중요하다. 그리고 그 첫 번째 일치 승. 논리는 다르지만 유사 URL 구조 인 www.mysite.com/coming-soon 및 www.mysite.com/{profile name}이있는 두 가지 작업을 원하면 첫 번째 URL에 정적 부분이 있고 나중에 동적으로 다음과 같이 할 수 있다고 가정합니다. 이 :

Global.asax에

public static void RegisterRoutes(RouteCollection routes) 
{ 
routes.MapRoute(
       "Coming-soon", // Route name 
       "coming-soon", // URL with parameters 
       new { controller = "Home", action = "ComingSoon" } // Parameter defaults 
      ); 

routes.MapRoute(
       "Profiles", // Route name 
       "{profileName}", // URL with parameters 
       new { controller = "Home", action = "Profile"} // Parameter defaults 
      ); 
} 

public class HomeController : Controller 
{ 
public ActionResult ComingSoon() 
{ 
    return View(); 
} 

public ActionResult Profile(string profileName) 
{ 
    return View(); 
} 

} 
당신은 URL을에 하이픈을 허용 할 사용자 지정 경로 처리기 만들 수
+0

cool i will 이 시도. 컨트롤러 이름이 정확하다면 동적 프로필 작업 이름을 사용하지 않기를 원하기 때문에 여기에서 순서가 중요합니까? 예를 들어 www.website.com/controllername은 [profilename]이 "controllername"일 때 www.website.com/[profilename]에서 이깁니다. – mike

+0

기본적으로 예, 컨트롤러 이름이 아닌 작업 이름입니다. 문제가 해결되면 대답으로 표시하십시오.) – frennky

+0

@ frennky 귀하의 솔루션은 곧 출시 될 예정이며 동적 인 부분이 거의 있습니다. 동적 인 부분에서 내가 누락 된 유일한 것은 "프로필"작업에 대한 매개 변수입니다. 그래서 귀하의 코드 예제에서, 나는 방금 그것을 테스트하고 올바르게 www.website.com/[profilename]을 home 프로파일로 action 프로파일로 라우트합니다. 그러나 Profile은 [profilename]과 일치하는 매개 변수 ID를 사용합니다. 내 사이트의 프로필 이름은 고유하므로 좋은 고유 식별자 역할을합니다. URL의 {profileName}을 사용하여 라우팅 객체를 수정하고 매개 변수로 전달하는 방법은 무엇입니까? – mike

3

:

새로운 핸들러를 만들기를

public class HyphenatedRouteHandler : MvcRouteHandler{ 
     protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
     { 
      requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_"); 
      requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_"); 
      return base.GetHttpHandler(requestContext); 
     } 
    } 

... 그리고 새로운 경로 : 나는 암시 적으로 모든-MVC/URL로 EveryMvc/URL을 변환하는 첫 번째 문제에 대한 오픈 소스 NuGet 라이브러리을 개발했습니다

routes.Add(
      new Route("{controller}/{action}/{id}", 
       new RouteValueDictionary(
        new { controller = "Default", action = "Index", id = "" }), 
        new HyphenatedRouteHandler()) 
     ); 

MVC Hyphenated urls

3

.

대시 URL은 훨씬 더 SEO 친절하고 읽기가 쉽습니다. (More on my blog post)

NuGet 패키지 : https://www.nuget.org/packages/LowercaseDashedRoute/

그것을 설치하려면, 단순히 프로젝트를 클릭하고 NuGet 패키지 관리자를 선택하고, "온라인"탭 유형 "소문자 대 시선을 마우스 오른쪽 버튼으로 비주얼 스튜디오에서 NuGet 창을 엽니 다 경로 "를 선택하면 팝업이 나타납니다.

다른 방법으로는 패키지 관리자 콘솔에서이 코드 을 실행할 수 있습니다

Install-Package LowercaseDashedRoute

를 그 후에는 App_Start/RouteConfig.cs을 열고 route.MapRoute 기존의 주석 처리한다 (...) 전화를 걸어 다음 내용을 추가하십시오.

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}", 
    new RouteValueDictionary(
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }), 
    new DashedRouteHandler() 
) 
); 

그게 전부입니다. 모든 URL은 소문자이고 점선으로 표시되며 암시 적으로 변환됩니다.

오픈 소스 프로젝트 URL : https://github.com/AtaS/lowercase-dashed-route

는 두 번째 문제에 관해서, 당신도 당신의 자신의 경로를 만들거나 사용자 지정 오류 처리 메커니즘 발견되지 취급으로이 작업을 수행 할 수 있지만, 라우팅 빠른 경우가 될 것입니다 당신은 콘텐츠 파일 URL (예 : .css .js 등)에서 훨씬 쉽게 다른 URL과 구별 할 수 있도록 일부 규칙에 동의하도록 프로필 URL을 제한합니다.

+1

나는 귀하의 도서관을 구현했으며 완벽하게 작동합니다. 그러나 작은 문제가 하나 있는데, 여러 경로를 사용하고 있는데 기본값이 아니라 현재 MapRoute() 설정 내에서 "name"태그를 사용하여 호출 중입니다. 라이브러리에서 어떻게 구현할 수 있습니까? –

관련 문제