कंट्रोलर .NET MVC में एक URL बनाना


131

मुझे ईमेल भेजने के लिए कंट्रोलर पर एक्शन में एक लिंक बनाने में सक्षम होने की आवश्यकता है। ऐसा करने के लिए सबसे अच्छा अभ्यास क्या है? मैं अपने मार्गों को बदलने की स्थिति में स्वयं इसका निर्माण नहीं करना चाहता।

क्या मुझे प्रत्येक ईमेल के लिए एक दृष्टिकोण रखना चाहिए और उसे प्रस्तुत करना चाहिए और उसे भेजना चाहिए? यह करने का एक अच्छा तरीका हो सकता है।

जवाबों:


230

यदि आप केवल एक निश्चित कार्रवाई के लिए मार्ग प्राप्त करना चाहते हैं, तो उपयोग करें UrlHelper:

UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("About", "Home", null);

अगर आप हाइपरलिंक बनाना चाहते हैं:

string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext, System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", "Home", null, null);

Intellisense आपको प्रत्येक पैरामीटर का अर्थ देगा।


टिप्पणियों से अपडेट करें : नियंत्रक में पहले से ही एक है UrlHelper:

string url = this.Url.Action("About", "Home", null); 

17
अनुसरण करे: पिछले पैरामीटर (RouteValueDictionary) यहां से पीछे नहीं के लिए एक उदाहरण है: नई System.Web.Routing.RouteValueDictionary (नए {आईडी = 1})
मैथ्यू एम

15
आपको एक नया UrlHelper बनाने की आवश्यकता नहीं है; नियंत्रक पर एक .Url संपत्ति है जो आपको सही RequestContext के साथ एक देगी।
तोबियस जे

"रूट" कहाँ से आता है? अगर मुझे उस रूट के नाम को हार्डकोड करना है जो मैं मैच करने की कोशिश कर रहा हूं, तो बस यूआरएल को हार्डकोड क्यों नहीं करना चाहिए?
xr280xr

@ xr280xr: मेरा मानना ​​है कि इस उदाहरण में "रूट" रूट का नाम है जैसा कि रजिस्टररूटेस विधि (आमतौर पर रूटकॉन्फिग) में परिभाषित किया गया है। मेरे लिए, यह "डिफ़ॉल्ट" था (जैसा कि जब मैंने अपनी परियोजना बनाई थी)।
एंडी

3
आपको UrlHelper को नया करने की आवश्यकता नहीं है, बस Url प्रॉपर्टी को कंट्रोलर क्लास में एक्सेस करें।
जय डॉकलाज़

22

यदि आपको पूर्ण url की आवश्यकता है (उदाहरण के लिए ईमेल द्वारा भेजने के लिए) निम्नलिखित अंतर्निहित तरीकों में से एक का उपयोग करने पर विचार करें:

इसके साथ आप url बनाने के लिए उपयोग करने के लिए मार्ग बनाते हैं:

Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

रूट इंजन सही निर्धारित करने के बाद यहां url बनाया गया है:

Url.Action("Detail","Opinion",new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

दोनों विधियों में, अंतिम 2 पैरामीटर प्रोटोकॉल और होस्टनाम निर्दिष्ट करता है।

सादर।


7
FYI करना Url.Action(action, controller, routevalue, protocol)भी पूर्ण URL का उत्पादन करता है, इसलिए यदि आपको आवश्यकता नहीं है, तो आपको होस्टनाम निर्दिष्ट करने की आवश्यकता नहीं है।
एंडी तजहोनो

1
मुझे पोर्ट संख्या के साथ निम्न URL मिल रहा है, कृपया इसे कैसे ठीक करें? http: // localhost: 54383: 54383 / MyArea / MyController / Details / 1
Patee Gutee

12

मेरे पास एक ही मुद्दा था, और ऐसा प्रतीत होता है कि गिदोन के उत्तर में एक छोटा दोष है: यह एक सापेक्ष URL उत्पन्न करता है, जिसे मेल द्वारा नहीं भेजा जा सकता है।

मेरा समाधान इस तरह दिखता है:

string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });

इस तरह, एक पूर्ण URL उत्पन्न होता है, और यह तब भी काम करता है, जब एप्लिकेशन होस्टिंग सर्वर पर कई स्तर गहरा हो, और 80 के अलावा किसी अन्य पोर्ट का उपयोग करता हो।

संपादित करें: मैंने इसे उपयोगी पाया ।


कृपया ध्यान दें कि यह एक प्रमुख सुरक्षा भेद्यता है। यह सब लेगा कोई है जो होस्ट के रूप में एक दुर्भावनापूर्ण URL शामिल करने के लिए अनुरोध हेडर को संशोधित कर रहा है और आपका आवेदन एक आधिकारिक ईमेल भेजेगा जिसमें एक खतरनाक वेबसाइट का लिंक होगा।
V0ldek

7

किसी कार्रवाई के लिए एक निरपेक्ष URL बनाने का दूसरा तरीका:

var relativeUrl = Url.Action("MyAction");  //..or one of the other .Action() overloads
var currentUrl = Request.Url;

var absoluteUrl = new System.Uri(currentUrl, relativeUrl);

4

मुझे पता है कि यह एक पुराना सवाल है, लेकिन सिर्फ अगर आप ASP.NET Core में एक ही काम करने की कोशिश कर रहे हैं, तो यहां बताया गया है कि आप एक एक्शन के अंदर UrlHelper कैसे बना सकते हैं:

var urlHelper = new UrlHelper(this.ControllerContext);

या, Controller.Urlयदि आप विरासत से संपत्ति का उपयोग कर सकते हैं Controller

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.