代码之家  ›  专栏  ›  技术社区  ›  Å¡ljaker

基于当前路由的操作

  •  6
  • Å¡ljaker  · 技术社区  · 16 年前

    我想基于现有路由生成一个新的URL,但将添加一个新参数“page”
    以下是几个例子:

    旧的:~/localhost/something?什么=2
    新增:~/localhost/something?what=2&page=5页

    旧:~/localhost/shoes
    新:~/localhost/shoes/5

    我不能只附加 &页面=5 到现有的URL,因为路由可能不同。
    有些使用查询字符串,有些不使用。

    3 回复  |  直到 14 年前
        1
  •  6
  •   jsalwen    16 年前

    我有一个类似的问题,并采取了扩展厄勒佩尔的方法。视图中的代码如下:

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

    几个注意事项:我检查身份证,因为我没有在所有的路线中使用它。我在末尾添加了页面路由值,所以它是最后一个URL参数(否则您可以将其添加到初始构造函数中)。

        2
  •  1
  •   Jack    14 年前

    这似乎是一个很好的方法:

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

    它可以避免碰撞,比如?控制器=示例&操作=问题等。

        3
  •  0
  •   Elijah66    16 年前

    您可以通过 RouteData 对象。例如,下面将呈现带有当前路由的控制器和操作的URL:

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

    要开始,您可以使用类似自定义扩展方法的方法,该方法使用附加的“page”参数生成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中的实段还是作为查询字符串附加的。