2010-12-30 3 views
7

경로에 설정하려고하는 특정 제약 조건에 문제가 있습니다. 내 URL은 다음과 같아야합니다. http://hostname/id-my-title-can-be-that-long 여기서 id는 숫자로만 구성되며 제목은 대문자로 구분 된 소문자입니다. ID와 제목도 대시로 구분됩니다. 예 : http://hostname/123-my-title.ASP.NET MVC 정규식 경로 제한

여기 내 경로 정의입니다 :

routes.MapRoute(
    "Test", 
    "{id}-{title}", 
    new { controller = "Article", action = "Index" }, 
    new { id = @"(\d)+", title = @"([a-z]+-?)+" } 
); 

URL은 제대로 HTML 헬퍼로 생성됩니다

<%: Html.ActionLink("My link", "Index", "Article", new { id = Model.IdArticle, title = Model.UrlTitle }, null) %> 

은 물론, Model.IdArticle가 INT32 및 Model.UrlTitle A는 내 요구 사항과 일치하는 제목의 미리 만들어진 문자열 (소문자 만, 대시로 대체 된 공간).

문제는 내가 링크를 따라 가면 오른쪽 컨트롤러 & 메서드가 호출되지 않았기 때문에 잘못된 다음 경로로 넘어갑니다. 기록을 위해

, 내가 ASP.NET MVC에있어 2

사람은 아이디어가있다? 사전에

감사합니다, 파비안

당신은 전체 경로 문자열 "{ID} - {제목} '통과 시도 할 수
+0

마지막으로 우리는 제목과 ID를 구분하지 않을 것입니다. 왜 아직도 작동하지 않는지 궁금하지만 더 이상 차단하지 않습니다. 당신의 도움을 주셔서 감사합니다! –

답변

0

이 필 Haack의 비슷한을 수행하여 행동에 도달하기 전에 자신을 수동으로 문자열을 구문 분석 이글루스의 id actionfilter 속성 - link

희망이 있습니다.

+0

전에 블로그 게시물을 읽었지만 경로 정보를 나눌 수있을 때 과도 함을 느낍니다. 경로에서 내 URL을 만들 수 있지만 경로로 해결되지 않았으므로 MVC의 버그에 대해 생각하고 있습니다. –

+0

아, 그 정도면 충분합니다. 또 다른 생각을 가지고 있습니다 :-) – WestDiscGolf

0

경로의 여러 문자가 "특별"되어 - 및 /와 같은 매개 변수가 분리됩니다. 경로에있는 여분의 파일이 실패 할 수 있습니다. 시도해보십시오 "{id}-{*title}"이 제목에 뒤 따르는 모든 것을 포함하게 만듭니다.

업데이트

대답은 위의 충분한 커피를 했어 전에에 유래 갈 때 일어나는 것입니다.

사용자가 업로드 한 파일의 파일 이름을 처리 할 때와 동일한 문제가 발생했으며 경로에 '-'가 구분 기호로 포함되어 있지만 이후 매개 변수의 값으로도 사용될 수 있지만 올바른 URL을 생성 할 수는 있지만 wouldn 그것과 일치하지 마라. 결국이 문제를 처리하고이 경로를 등록하기 위해 SpecialFileRoute 클래스를 작성했습니다. 조금 추한 일이지만 그 일을합니다.

URL을 생성하기 위해 이전 스타일의 MVC 경로를 유지했음을 유의하십시오.이 작업을 올바르게 수행하기 위해 노력하고 있었지만 나중에 다시 돌아올 내용입니다.

이 위에서 언급 한 바와 같이
context.Routes.Add(new SpecialFileRoute(AreaName) { Controller = "Doc", Action = "Download" }); 

조금 못생긴 내가 많은 일이있어 시간이있을 때 내가이 문제를 개선 할 좋아하지만 것 다음과 같이

/// <summary> 
/// Special route to handle hyphens in the filename, a catchall parameter in the commented route caused exceptions 
/// </summary> 
public class SpecialFileRoute : RouteBase, IRouteWithArea 
{ 
    public string Controller { get; set; } 
    public string Action { get; set; } 
    public IRouteHandler RouteHandler = new MvcRouteHandler(); 
    public string Area { get; private set; } 

    //Doc/{doccode} - {CatNumber}.{version} - {*filename}, 

    public SpecialFileRoute(string area) 
    { 
     Area = area; 
    } 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     string url = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2); 
     var urlmatch = Regex.Match(url, @"doc/(\w*) - (\d*).(\d*) - (.*)", RegexOptions.IgnoreCase); 
     if (urlmatch.Success) 
     { 
      var routeData = new RouteData(this, this.RouteHandler); 

      routeData.Values.Add("doccode", urlmatch.Groups[1].Value); 
      routeData.Values.Add("CatNumber", urlmatch.Groups[2].Value); 
      routeData.Values.Add("version", urlmatch.Groups[3].Value); 
      routeData.Values.Add("filename", urlmatch.Groups[4].Value); 
      routeData.Values.Add("controller", this.Controller); 
      routeData.Values.Add("action", this.Action); 
      return routeData; 
     } 
     else 
      return null; 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     if (values.ContainsKey("controller") && (!string.Equals(Controller, values["controller"] as string, StringComparison.InvariantCultureIgnoreCase))) 
      return null; 
     if (values.ContainsKey("action") && (!string.Equals(Action, values["action"] as string, StringComparison.InvariantCultureIgnoreCase))) 
      return null; 
     if ((!values.ContainsKey("contentUrl")) || (!values.ContainsKey("format"))) 
      return null; 
     return new VirtualPathData(this, string.Format("{0}.{1}", values["contentUrl"], values["format"])); 
    } 
} 

경로가 추가됩니다 필요한 매개 변수로 URL을 분할하는 문제를 해결했습니다. URL 패턴이있는이 한 경로의 특정 요구 사항에 매우 강하게 묶여 있습니다. Regex 및 Values는 코드화되어 있지만 시작에 도움이됩니다.

+0

정보 주셔서 감사하지만 두 개 이상의 섹션을 포함하는 세그먼트에서 catchall (*) 매개 변수를 사용할 수 없습니다. –

+0

D' oh, 물론. 나는 전에도 같은 문제에 반대했다. – Chao