2010-02-11 2 views
6

나는 기존의 경로를 기반으로 새 URL을 생성하고 싶습니다,하지만 새 매개 변수 '페이지'
다음 있는 몇 가지 예 추가합니다 :
Url.Action는

오래된 : ? ~/로컬 호스트/일 무슨 일이 2 & 페이지 = 5

된 = : ~/로컬 호스트/일이 무엇 2
새를 =? ~/로컬 호스트/신발
새로운 : ~/로컬 호스트/신발/5

경로가 다를 수 있으므로 & 페이지 = 5을 기존 URL에 추가 할 수 없습니다.
일부는 쿼리 문자열을 사용하고 일부는 사용하지 않습니다.

답변

6

나는 비슷한 문제가있어서 UrlHelper를 확장하는 방법을 사용했습니다.

<a href="<%= Url.AddPage(2) %>">Page 2</a> 

UrlHelper 확장은 다음과 같습니다 : 같은보기의 코드는 보이는

using System.Web.Mvc; 
using System.Web.Routing; 
using System.Collections.Specialized; 

public static class UrlHelperExtension 
{ 
    public static string AddPage(this UrlHelper helper, int page) 
    { 

     var routeValueDict = new RouteValueDictionary 
     { 
      { "controller", helper.RequestContext.RouteData.Values["controller"] }, 
      { "action" , helper.RequestContext.RouteData.Values["action"]} 
     }; 

     if (helper.RequestContext.RouteData.Values["id"] != null) 
     { 
      routeValueDict.Add("id", helper.RequestContext.RouteData.Values["id"]); 
     } 

     foreach (string name in helper.RequestContext.HttpContext.Request.QueryString) 
     { 
      routeValueDict.Add(name, helper.RequestContext.HttpContext.Request.QueryString[name]); 
     } 

     routeValueDict.Add("page", page); 

     return helper.RouteUrl(routeValueDict); 
    } 
} 

노트의 몇 : 내 모든 경로에서 사용하지 않기 때문에 내가의 ID를 확인 . 페이지 경로 값을 끝에 추가하므로 마지막 URL 매개 변수입니다 (그렇지 않으면 초기 생성자에 추가 할 수 있음).

0

RouteData 개체를 통해 기존 경로의 일부를 꺼내서 URL을 재구성 할 수 있습니다.

<%=Url.RouteUrl(new { controller = ViewContext.RouteData.Values["controller"], 
         action = ViewContext.RouteData.Values["action"] }) %> 

당신은 추가 "페이지와 URL을 생성하는 사용자 정의 확장 방법과 같이 갈 수있다, 당신은 시작하려면 : 예를 들어, 다음은 현재 경로의 컨트롤러와 액션과 URL을 렌더링 할 "매개 변수. 필요에 따라 조정 : 페이지 URL에 실제 세그먼트가 아니면 그냥 쿼리 문자열로 추가 여부를

public static string UrlWithPage(this UrlHelper urlHelper, string name, int page) 
    { 
     string url = urlHelper.RouteUrl(
      new { 
        controller = urlHelper.RequestContext.RouteData.Values["controller"], 
        action = urlHelper.RequestContext.RouteData.Values["action"], 
        id = urlHelper.RequestContext.RouteData.Values["id"], 
        page = page 
       } 
      ); 

     return "<a href=\"" + url + "\">" + name + "</a>"; 
    } 

이것은 라우팅 구성에 따라 올바른 형식의 링크를 구성합니다.

+0

내가 경로에있는 매개 변수의 수는 일정하지? . 나는 10 개를 가질 수도 있고, 예를 들어 1 개만 가질 수도 있습니다. –

+0

나는 다른 대답이 없기 때문에 이것을 받아 들여야 할 것이다. :) –

1

이것은 좋은 방법처럼 보인다 :

// Clone Current RouteData 
var rdata = new RouteValueDictionary(Url.RequestContext.RouteData.Values); 

// Get QueryString NameValueCollection 
var qstring = Url.RequestContext.HttpContext.Request.QueryString; 

// Pull in QueryString Values 
foreach (var key in qstring.AllKeys) { 
    if (rdata.ContainsKey(key)) { continue; } 
    rdata[key] = qstring[key]; 
} 

// Update RouteData 
rdata["pageNo"] = "10"; 

// Build Url 
var url = Url.RouteUrl(rdata); 

과 같은 충돌을 방지 컨트롤러 = 예를 & 행동 = 문제 등