我想基於現有的航線上一個新的URL,但會增加新的參數「頁面」
這裏有幾個例子:
Url.Action
老: ?〜/本地主機/什麼什麼= 2
新:〜/本地主機/什麼什麼= 2 &頁= 5
老:〜/本地主機/鞋
新:〜/本地主機/鞋/ 5
我不能只是追加& page = 5到現有的網址,因爲路線可能不同。
有的使用查詢字符串,有的使用查詢字符串。
我想基於現有的航線上一個新的URL,但會增加新的參數「頁面」
這裏有幾個例子:
Url.Action
老: ?〜/本地主機/什麼什麼= 2
新:〜/本地主機/什麼什麼= 2 &頁= 5
老:〜/本地主機/鞋
新:〜/本地主機/鞋/ 5
我不能只是追加& page = 5到現有的網址,因爲路線可能不同。
有的使用查詢字符串,有的使用查詢字符串。
我有一個類似的問題,並採取了擴展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參數(否則可以將它添加到最初的構造函數中)。
您可以通過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真正段或只是追加爲查詢字符串。
這似乎是一個好辦法:
// 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);
,並避免衝突,如控制器=例如&行動=問題等
的,我在路由參數數目不恆定? 。 我可能有10個或可能只有1個(在你的例子中的id)。 – 2010-02-12 10:23:05
因爲沒有其他答案,我必須接受這個:) – 2010-07-28 21:45:04