2010-11-24 2 views
4

내 MVC2 앱은 후속 AJAX 호출을 동일한 작업으로 되돌려 보내는 구성 요소를 사용합니다.이 구성 요소는 모든 종류의 불필요한 데이터 액세스 및 서버 처리를 유발합니다. 구성 요소 공급 업체는 이러한 후속 요청을 다른 작업으로 다시 라우팅 할 것을 제안합니다. 후속 요청은 특정 쿼리 문자열을 가지고 있다는 점에서 다르며, 내 경로 테이블의 쿼리 문자열에 제약 조건을 둘 수 있는지 여부를 알고 싶습니다.내 MVC2 앱에서 쿼리 문자열 매개 변수의 경로 제약 조건을 지정할 수 있습니까?

예를 들어, 초기 요청은 http://localhost/document/display/1과 같은 URL로 제공됩니다. 이것은 기본 라우트로 처리 할 수 ​​있습니다. URL에서 "공급 업체"를 감지하여 http://localhost/document/display/1?vendorParam1=blah1&script=blah.jshttp://localhost/document/display/1?vendorParam2=blah2&script=blah.js과 같은 URL을 처리하는 사용자 지정 경로를 작성하고 싶습니다.

routes.MapRoute(
    null, 
    "Document/Display/{id}?{args}", 
    new { controller = "OtherController", action = "OtherAction" }, 
    new RouteValueDictionary { { "args", "vendor" } }); 

내가 계정에 쿼리 문자열을 사용 경로를 쓸 수 :

나는은 다음 만이 System.ArgumentException: The route URL cannot start with a '/' or '~' character and it cannot contain a '?' character.가 발생 했어요? 그렇지 않다면 다른 아이디어가 있습니까?


업데이트 : 내가 http://localhost/document/display/1DocumentController.Display 조치로 라우팅되지만 http://localhost/document/display/1?vendorParam1=blah1&script=blah.jsVendorController.Display 조치로 라우팅되도록 라우팅 제약을 쓸 수 있습니다, 간단히 말하면? 궁극적으로 쿼리 문자열에 "공급 업체"가 포함 된 URL을 VendorController.Display 작업으로 라우팅하려고합니다.

첫 번째 URL은 기본 경로로 처리 할 수 ​​있지만 두 번째 것은 어떨까요? 이 모든 작업을 수행 할 수 있습니까? 많은 부분의 시행 착오 끝에 내 대답은 "아니오"인 것처럼 보입니다.

답변

9

QueryString을은 기본적으로 지원되지 않는 있지만 , 제약 조건에서 사용할 수있는 매개 변수. Here ASP.NET MVC 2에서이 기능을 구현하는 방법을 설명하는 문서를 찾을 수 있습니다.

네덜란드어로 작성되었으므로 여기에 구현 된 내용이 있습니다.

public class QueryStringConstraint : IRouteConstraint 
{ 
    private readonly Regex _regex; 

    public QueryStringConstraint(string regex) 
    { 
     _regex = new Regex(regex, RegexOptions.IgnoreCase); 
    } 

    public bool Match (HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     // check whether the paramname is in the QS collection 
     if(httpContext.Request.QueryString.AllKeys.Contains(parameterName)) 
     { 
      // validate on the given regex 
      return _regex.Match(httpContext.Request.QueryString[parameterName]).Success; 
     } 
     // or return false 
     return false; 
    } 
} 

지금 당신은 당신의 경로에서 이것을 사용할 수 있습니다 :에 'IRouteConstraint'클래스 추가

routes.MapRoute("object-contact", 
    "{aanbod}", 
    /* ... */, 
    new { pagina = new QueryStringConstraint("some|constraint") }); 
+0

감사합니다. Jan.이 문제를 좀 더 자세히 살펴보면 내가하고 싶은 일에서 효과를 낼 수 있다면 답을 바꿀 수도 있습니다. 후속 조치로, MVC 3에서이 중 하나를 변경하겠습니까? – flipdoubt

+0

아니요, 저는 이것이 MVC 3에서 잘 작동 할 것이라고 확신합니다. 이것들은 Microsoft 구현의 기본적인 개념입니다. ASP.NET은 실제 파일에 실제로 매핑되지 않는 10.000.000 개의 다른 URL을 ASP.NET이 좋아하지 않기 때문에이를 사용합니다. –

2

경로가 필요하지 않습니다. 이미 기본 모델 바인더에 의해 처리됩니다. 쿼리 문자열 매개 변수가 자동으로 동작 인수에 바인딩됩니다

public ActionResult Foo(string id, string script, string vendorname) 
{ 
    // the id parameter will be bound from the default route token 
    // script and vendorname parameters will be bound from the request string 
    ...  
} 

UPDATE :

당신에게 전달되는 쿼리 문자열 매개 변수의 이름을 모르는 경우 수 그들을 통해 루프 :

foreach (string key in Request.QueryString.Keys) 
{ 
    string value = Request.QueryString[key]; 
} 
+0

감사합니다. Darin,하지만 게시 한 샘플 코드는 요청을 다른 컨트롤러로 다시 라우팅하려고합니다. 또한 구성 요소는 각기 다른 매개 변수를 갖는 여러 개의 후속 요청을 작성하며 일부 매개 변수에는 공급 업체 이름이 접두사로 붙습니다. – flipdoubt

+0

@flipdoubt, 전달할 쿼리 문자열 매개 변수의 이름을 모르는 경우 반복 할 수 있습니다. 그리고 라우트는 다음과 같을 것입니다 : routes.MapRoute (null, "Document/Display/{id}", new {controller = "OtherController", action = "OtherAction"}); –

+0

"아니오, 쿼리 문자열 매개 변수를 경로 제약 조건에 사용할 수 없습니다." – flipdoubt

-1

이 게시물 오래된,하지만 당신은 당신의 기본 경로

을하기 전에 경로를 쓸 수 없습니다

이 경우에만 args에 "vendor"가있는 경로를 잡습니다.

routes.MapRoute(
    null, 
    "Document/Display/{id}?{args}", 
    new { controller = "VendorController", action = "OtherAction" }, 
    new {[email protected]".*(vendor).*"}//believe this is correct regex to catch "vendor" anywhere in the args 

);

그리고이 잡을 것이다 나머지

routes.MapRoute(
     null, 
     "Document/Display/{id}?{args}", 
     new { controller = "DisplayController", action = "OtherAction" } 
    ); 

내가 MVC에 초보자입니다하지만이 작동합니다 생각이 시도하지습니까? 제약 조건이 일치하지 않으면 내가 알고있는 것으로부터 경로가 사용되지 않습니다. 따라서 다음 경로를 테스트합니다. 다음 경로는 args에 대한 제약 조건을 사용하지 않으므로 경로와 일치해야합니다.

나는 이것을 시험해보고 나를 위해 일했다.

+1

경로 URL에 '?'을 포함 할 수 없습니다. 캐릭터. – Softlion

관련 문제