2014-10-12 3 views
1

내가 같은 경로를 얻기 위해 노력하고 있어요 :MVC 라우팅

{랭 : 옵션}/{컨트롤러}/{작업을}/{ID : 선택 사항} "컨트롤러 제약"으로

이 기사의 아이디어 : (MVC Routing Constraint on Controller Names), 위의 경로는 {lang} 값이 제시 될 때 매우 잘 작동합니다. 그렇지 않으면 작동하지 않습니다는 {LANG} 값을 제시해야합니다 위의 경로에 대한

routeName: testRoute 
url: {lang:optional}/list/{something:optional} 
{controller = "product", action = "index"} 

:

그러나 나는이 경로와 일치하는 문제가있다.

해결 방법에는 두 가지 해결 방법이 있습니다.

첫 번째 방법은 위의 두 가지 경로를 설정하는 것입니다 :

한 매우 표준 :

routeName: testRoute 
url: /list/{something} 
{controller = "product", action = "index"} 

다른 매우 표준 하나를 내가 궁금하고

routeName: testRouteLang 
url: {lang:not_optional}/list/{something:optional} 
{controller = "product", action = "index", lang="de"} 

가 두 가지 표준 경로를 하나의 단일 경로로 결합하는 방법입니다.

두 번째 해결 방법은 하위 도메인 이름을 사용하는 등

http://example.com/list (default to English) 
http://de.example.com/list (de) 

하지만 난 정말 SEO 이유로 하위 도메인 아이디어 (어쩌면 내가이 점에 대한 잘못된 생각을) 좋아하지 않는다.

제 목표는 URL에서 기본 "en-us"를 제거하는 것입니다. 나는 현재의 문화가 영어가 아닌 경우이

http://www.example.com/list/something (default as English) 

내가

http://www.example.com/en-us/list/something 

은 "랭"URL 만 제시 될 필요가있는 URL에 "EN-US"강제로 싶지 않아 같은 :

http://www.example.com/de 
http://www.example.com/fr/list/something 

감사합니다.

답변

0

마침내 나는 매우 쉽고 건조한 해결책을 발견했습니다. 핵심은 URL에이 "en"이 표시되지 않고 HttpContext.Current.RewritePath을 사용하여 기본 "en"을 주입하는 것입니다.

protected void Application_BeginRequest() 
{ 
    var rawUrl = HttpContext.Current.Request.RawUrl; 
    var segments = HttpContext.Current.Request.Url.Segments; 
    var segment1 = segments.Count() >= 2 ? segments[1] : string.Empty; 
    if (IsSomethingThatIWantToHandle("are,you,js,script,css,jpg,png,and,so,on?") 
    && !LittleHelper.DoIHaveValidLangAlready(segment1)) 
    { 
    HttpContext.Current.RewritePath("/en" + rawUrl); 
    } 
} 

URL을 생성 할 때 lang이 null이거나 비어 있으면 URL에 double //이 생깁니다. 여분의 "/"를 제거하기 위해 약간의 도우미가 필요합니다.

경로를 정의 할 때에 영역 이름을 에 추가해야합니다. 그렇지 않으면 영역이 프로젝트에 표시되는 경우보기를 올바르게 찾을 수 없습니다.

routes.MapRoute(
    "good name", 
    "{lang}/some-cool-stuff/{id}/{slug}", 
    defaults: new { area = "bigarea", controller = "bigcontroller", action = "tinyaction", 
    lang = UrlParameter.Optional, id = UrlParameter.Optional, slug = UrlParameter.Optional } 
    , constraints: new { lang = new CultureConstraint() } 
).DataTokens.Add("area", "bigarea"); 

CultureConstraint는 매우 간단합니다. 올바른 문화권 이름인지 확인하십시오. 네임 스페이스 제약 조건은 필요하지 않습니다.그러나 경로 테이블이 크고 복잡하면 컨트롤러 제약 또는 작업 제약이 필요합니다. 그렇지 않으면 복제 된 경로가 문제가됩니다.

내 프로젝트에서 내 기본 경로는 지금 : URL : "{랭}/{지역}/{컨트롤러}/{동작}/{ID}/{슬러그}",

그리고 내가 원하는대로 아름답게 작동합니다.