2010-02-23 7 views

답변

2

ID는 항상 숫자로 보장됩니까? 예, 당신은 RouteConstraints를 사용할 수있는 경우 :

public class IDConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, 
         string parameterName, RouteValueDictionary values, 
         RouteDirection routeDirection) 
    { 
     var value = values[parameterName] as string; 
     int ID; 
     return int.TryParse(value,out ID); 
    } 
} 

는 기본적으로 무슨 일이 일어나고 있는지 당신이 여기에 두 개의 동일한 루트 가지고있다 - 두 개의 매개 변수를, 그래서 ambigous입니다 :

routes.MapRoute("ActionIDRoute", 
       "{action}/{id}", 
       new { controller = "SomeController" }, 
       new {id= new IDConstraint()}); 
routes.MapRoute("ControllerActionRoute", 
       "{controller}/{action}", 
       new {}); // not sure about this last line 

IDConstraint 클래스는 다음과 같습니다. 매개 변수에 경로 제한 조건이 적용되어 일치하는지 확인합니다.

그래서 : id 매개 변수 (SomeAction), ASP.net MVC 것에 제약이 있으므로이 두 자리

  • 을 가지고로

    1. 당신은,
    2. 그것은 ActionIDRoute 충돌합니다 http://localhost/SomeController/SomeAction 전화 int.TryParse으로
    3. 이 SomeAction에 실패() 함수 경로는
    4. 일치하는 다음 경로 인 ControllerActionRoute
    5. 폐기 일치를 호출 ID가 숫자를 보장하지 않는 경우
    6. 이 일치하고 아무런 제약이없는 것처럼이,이

  • 를 이동합니다, 당신은 모호성을 해결할 수있는 문제가 있습니다. 내가 알고있는 유일한 해결책은 {action}/{id}가 적용되는 경로를 하드 코딩하는 것인데 항상 가능하지는 않습니다.

    +0

    글쎄, id는 현재 숫자가 될 것이 확실하지만, 내가 무슨 뜻인지 알면, 프로젝트가 언제 확장되는지 알 수 있습니다. – TPR

    +0

    @progtick 사실,하지만 그건 문제가 될 수 있습니다. 마찬가지로 귀하의 쟁점은 2 개의 동등한 경로가 있다는 것입니다. 두 개의 경로는 형식이 같고 자리 표시 자의 수가 동일하기 때문에 동일하게 보입니다. 자리 표시 자의 이름은 중요하지 않지만 어떻게 든 구분할 필요가 있습니다. 의미가 항상 다른 경우 (ID는 항상 숫자이며 & Action은 숫자가 아니거나 ID가 항상 i_로 시작하고 & action은 i_로 시작하지 않음) 라우팅 경로 제약 조건은 한 가지 방법입니다. 다른 옵션 : 비슷한 경로가 없도록 경로를 완전히 변경하십시오. –

    +0

    동의합니다. 나는 이것에 대해 깊이 생각할 것이다. 한편, 귀하의 솔루션을 사용하여 솔루션 나를 위해 작동합니다. – TPR

    1

    예, 기본 규칙 위에 새 규칙을 추가하고 컨트롤러에 기본값을 제공 할 수 있습니다.

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

    샘플은 모든 동작을 "홈"컨트롤러로 전달합니다.

    +0

    및 domain.com/controller/action 경로를 처리하는 규칙은 무엇입니까? 나는 LogOn actionresult가 정의 된 AccountController를 가지고있다. 그러나 domain.com/account/logon은 라우팅 테이블에 의해 캐치되지 않습니다. – TPR

    +0

    기본 규칙이 적용됩니다. – AxelEckenberger

    관련 문제