2010-02-11 61 views
6

我想基于现有的航线上一个新的URL,但会增加新的参数“页面”
这里有几个例子:
Url.Action

老: ?〜/本地主机/什么什么= 2
新:〜/本地主机/什么什么= 2 &页= 5

老:〜/本地主机/鞋
新:〜/本地主机/鞋/ 5

我不能只是追加& page = 5到现有的网址,因为路线可能不同。
有的使用查询字符串,有的使用查询字符串。

回答

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,因为我不,我的所有路由使用它。我在末尾添加Page路由值,所以它是最后一个url参数(否则可以将它添加到最初的构造函数中)。

0

您可以通过RouteData对象拉出现有路线的部分来重建网址。例如,下面将会使当前路由控制器和动作的URL:

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

为了让您一开始,你可以用类似的东西有一个额外的“页面生成的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>"; 
    } 

这将构建基于路由配置格式正确的链接,页面是否在URL真正段或只是追加为查询字符串。

+0

的,我在路由参数数目不恒定? 。 我可能有10个或可能只有1个(在你的例子中的id)。 – 2010-02-12 10:23:05

+0

因为没有其他答案,我必须接受这个:) – 2010-07-28 21:45:04

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); 

,并避免冲突,如控制器=例如&行动=问题等