2011-09-06 4 views
2

다음 URL과 같은 경로가 있어야합니다.2 목적지로가는 경로를 가지고있는 방법

/authorid 
/documentid 
/authorid/documentid 

나는

/author/1 
/document/5 
author/1/document/25 

방법이 작업을 수행 할 수 있습니다 할 수 없습니다하려고?

설명. 문서와 작성자의 ID가 같을 수 있습니다. 하지만 저자가 우선해야합니다.

저자 : {ID : "djQuery는"}

문서 : {Aurhor : "밥", ID : "djQuery"}

가 액세스 할 수 있어야 통해/밥/djQuery

그러나 경우 당신은/djQuery로 간다. djQuery의 문서 목록을 얻어야한다.

+1

문서의 작성자와 동일한 ID를 사용할 수 없습니까? – joshb

+0

'document (id)'의'id'가 정수인 곳을 의미합니까? URL은 컨트롤러 및 액션에 매핑하는 방법을 보여줍니다. – TheCodeKing

+0

@ joshb : 사실은 아니지만 저자가 우선해야합니다. I.E 저자 djquery 및 문서 djquery는/djquery/djquery/ – David

답변

2

라우트를 구성하는 것만으로는 가능하지 않다고 생각합니다.

당신이 보내는 번호가 authorid인지 documentid인지는 프로그램에서 어떻게 알 수 있습니까?

할 수있는 일은/1이 페이지로 이동하면 그 페이지에서 문서 또는 작성자인지 확인한 다음 Response.Redirect를 실제 페이지, 작성자 /1.

2

당신이

/1 
/2 
/1/2 

난 당신이 같은 라우팅 규칙을 호출 처음 두 URL을 beacuse 그 achive 수 있다고 생각하지 않습니다 원하는 가정. 메서드 대신 다른 메서드를 호출 할 때는 알 수 없습니다. 내가 생각할 수있는 유일한 해결책은 ID를 식별 할 수 있다면 (예 : 1에서 10까지의 ID는 authorid이고 나머지는 documentId 임) 사용자 정의 규칙 핸들러를 작성하고 일치하는 메소드를 호출 할 수 있다는 것입니다. 이 DoumentId에 대한 authorid 및 "/ D2"에 대한 "/ A1는"그

routes.MapRoute("", "a{authorId}", new { controller = "Home", action = "AuthorDetail" }, new { authorId = @"\d+" }); 
routes.MapRoute("", "d{documentId}", new { controller = "Home", action = "DocumentDetail" }, new { documentId = @"\d+" }); 

편집 같은 것을 할 것이다 :

그렇지 않으면 당신은 고유하게 만들기 위해 URL에 뭔가를 넣어야 할 당신의 후 명확한 답변 counsellorben의 대답은 당신이 원하는 것을해야합니다.

+0

문서의 첫 번째 글자에 대해 미리 보류중인 글자에 대해 생각해 보았지만 작성자 ID와 문서 ID가 모두 생성되었으므로 오류가 발생합니다. – David

4

3 가지 경로와 적절한 RouteConstraints으로 원하는 것을 얻을 수 있습니다.

첫째, 당신은 당신의 경로를 설정해야합니다 :

using System; 
using System.Web; 
using System.Web.Routing; 

namespace ExampleApp.Extensions 
{ 
    public class MustBeValidAuthor : IRouteConstraint 
    { 
     public MustBeValidAuthor() { } 

     private DbContext _db = new DbContext(); 

     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)  
     {  
      return (_db.Authors.Where(u => u.AuthorName == values[parameterName].ToString()).Count() > 0); 
     } 
    } 

    public class MustBeValidDocument : IRouteConstraint 
    { 
     public MustBeValidDocument() { } 

     private DbContext _db = new DbContext(); 

     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)  
     {  
      return (_db.Documents.Where(u => u.DocumentName == values[parameterName].ToString()).Count() > 0); 
     } 
    } 
} 

RouteConstraints는 enfoce됩니다

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

    routes.MapRoute(
     "Author_Document", // Route name 
     "{author}/{document}", // URL 
     new { controller = "ShowDocument", action = "AuthorDocument" }, // Parameters 
     new { author = new MustBeValidAuthor(), document = new MustBeValidDocument() } 

    routes.MapRoute(
     "Author", // Route name 
     "{author}", // URL 
     new { controller = "ShowDocument", action = "Author" }, // Parameters 
     new { author = new MustBeValidAuthor() } 

    routes.MapRoute(
     "Document", // Route name 
     "{document}", // URL 
     new { controller = "ShowDocument", action = "Document" }, // Parameters 
     new { document = new MustBeValidDocument() } 

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

다음, 당신이 제공 한 정보가 유효한지 확인해야하는 당신의 RouteConstraints을 작성해야 요청의 유효성 및이 순서로 라우트를 배치하는 것은 요구 사항을 충족시킵니다.

+0

RouteConstraints를 조사해 주셔서 감사합니다. – David

0

IsAuthorConstraint가 문서 또는 작성자인지 여부를 결정하는 데 사용되는 것과 같은 것을 사용할 수 있습니다. 또는 문서 또는 작성자 작업에 전달하기 전에 브리징 작업으로 라우팅하고 논리를 배치 할 수 있습니다.

context.MapRoute(
    "authorid", 
    "{authorid}", 
    new { action = "Author", controller = "Controller", 
       authorid = -1 }, 
    new { authorid = new IsAuthorConstraint() } 
); 

context.MapRoute(
    "document", 
    "{documentid}", 
    new { action = "Document", controller = "Controller", 
       documentid = -1 } 
); 

// assume overload on author action 
context.MapRoute(
    "document and author", 
    "{authorid}/{documentid}", 
    new { action = "Author", controller = "Controller", 
       documentid = -1, authorid = -1 } 
); 

나는 컴퓨터가 아니기 때문에 정확하지 않을 수도 있지만 아이디어를 얻길 바랍니다.

0

@counsellorben이 제안한대로 Route 제약 조건에서만이를 수행 할 수 있지만 authorid와 documentid에는 동일한 ID가 없어야합니다.

있는 경우 충돌이 발생합니다.

관련 문제