Url.Action на основе текущего маршрута - PullRequest
6 голосов
/ 11 февраля 2010

Я бы хотел сгенерировать новый URL на основе существующего маршрута, но добавлю новый параметр 'page'
Вот несколько примеров:

old: ~ / localhost / что-то? What = 2
новое: ~ / localhost / что-то? what = 2 & page = 5

старый: ~ / localhost / Обувь
новое: ~ / localhost / Shoes / 5

Я не могу просто добавить & page = 5 к существующей ссылке, потому что маршруты могут отличаться.
Некоторые используют строку запроса, а некоторые нет.

Ответы [ 3 ]

6 голосов
/ 14 сентября 2010

У меня была похожая проблема, и я использовал расширение 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);
    }
}

Пара замечаний: я проверяю идентификатор, так как не использую его на всех своих маршрутах. Я добавляю значение маршрута Page в конце, так что это последний параметр URL (в противном случае вы можете добавить его в исходный конструктор).

1 голос
/ 20 сентября 2011

Это похоже на хороший подход:

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

и позволяет избежать коллизий, таких как? Controller = example & action = problem и т. Д.

0 голосов
/ 11 февраля 2010

Вы можете восстановить URL, вытянув части существующего маршрута с помощью объекта RouteData. Например, следующее будет отображать URL с контроллером и действием текущего маршрута:

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

Для начала вы можете использовать что-то вроде пользовательского метода расширения, который генерирует URL с дополнительным параметром "page". Отрегулируйте при необходимости:

 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 или просто добавлена ​​в виде строки запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...