/ / Url.action въз основа на текущия маршрут - asp.net-mvc

Url.action въз основа на текущия маршрут - asp.net-mvc

Бих искал да генерирам нов URL адрес въз основа на съществуващия маршрут, но ще добавя нов параметър "страница"
Ето няколко примера:

стар: ~ / localhost / нещо? какво = 2
нов: ~ / localhost / something? what = 2 & page = 5

стар: ~ / localhost / Обувки
нов: ~ / localhost / Обувки / 5

Не мога просто да се присъединя & Страница = 5 към съществуващия URL адрес, защото маршрутите могат да бъдат различни.
Някои използват низа на заявки, а някои не.

Отговори:

6 за отговор № 1

Имах подобен проблем и предприех подхода за разширяване на 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);
}
}

Няколко бележки: Проверявам за идентификатора, тъй като не го използвам по всичките си маршрути. Добавям стойността на маршрута на страницата в края, така че е последният параметър на URL адреса (в противен случай бихте могли да го добавите в първоначалния конструктор).


1 за отговор № 2

Това изглежда като добър подход:

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

и избягва сблъсъци като например? контролер = пример и действие = проблем и т.н.


0 за отговор № 3

Можете да реконструирате 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 адреса или просто е добавена като querystring.