यूआरएल.एक्शन वर्तमान मार्ग के आधार पर - asp.net-mvc

मैं मौजूदा मार्ग के आधार पर एक नया यूआरएल उत्पन्न करना चाहता हूं, लेकिन एक नया पैरामीटर "पेज" जोड़ूंगा
कुछ उदाहरण निम्नलिखित हैं:

पुराना: ~ / localhost / कुछ? क्या = 2
नया: ~ / localhost / कुछ? क्या = 2 और पेज = 5

पुराना: ~ / localhost / जूते
नया: ~ / लोकहोस्ट / जूते / 5

मैं सिर्फ जोड़ नहीं सकता और पेज = 5 मौजूदा यूआरएल के लिए क्योंकि मार्ग अलग हो सकते हैं।
कुछ क्वेरी स्ट्रिंग का उपयोग करते हैं और कुछ नहीं करते हैं।

उत्तर:

उत्तर № 1 के लिए 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);
}
}

कुछ नोट्स: मैं आईडी की जांच करता हूं, क्योंकि मैं इसे अपने सभी मार्गों में उपयोग नहीं करता हूं। मैं अंत में पृष्ठ मार्ग मान जोड़ता हूं, इसलिए यह अंतिम यूआरएल पैरामीटर है (अन्यथा आप इसे प्रारंभिक कन्स्ट्रक्टर में जोड़ सकते हैं)।


उत्तर № 2 के लिए 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);

और यह टकराव से बचाता है जैसे कि नियंत्रक = उदाहरण और क्रिया = समस्या इत्यादि।


जवाब के लिए 0 № 3

आप मौजूदा मार्ग के हिस्सों को खींचकर एक यूआरएल का पुनर्निर्माण कर सकते हैं RouteData वस्तु। उदाहरण के लिए, निम्नलिखित नियंत्रक और वर्तमान मार्ग की कार्रवाई के साथ एक यूआरएल प्रस्तुत करेगा:

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

आपको प्रारंभ करने के लिए, आप एक कस्टम एक्सटेंशन विधि की तरह कुछ के साथ जा सकते हैं जो यूआरएल को अतिरिक्त "पेज" पैरामीटर के साथ उत्पन्न करता है। आवश्यकतानुसार समायोजित करें:

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

यह रूटिंग कॉन्फ़िगरेशन के आधार पर एक उचित प्रारूपित लिंक तैयार करेगा, चाहे पृष्ठ यूआरएल में वास्तविक सेगमेंट है या सिर्फ क्वेरीस्ट्रिंग के रूप में जोड़ा गया है।