2009-09-18 11 views
162

आम तौर पर एक एएसपी.नेट दृश्य में कोई यूआरएल प्राप्त करने के लिए निम्न फ़ंक्शन का उपयोग कर सकता है (<a> नहीं):एचटीएमएल सहायक में यूआरएल उत्पन्न करें

Url.Action("Action", "Controller"); 

हालांकि, मुझे यह नहीं पता कि कस्टम HTML सहायक से इसे कैसे किया जाए। मेरे पास

public class MyCustomHelper 
{ 
    public static string ExtensionMethod(this HtmlHelper helper) 
    { 
    } 
} 

हैल्पर वैरिएबल में एक्शन और जेनरेटलिंक विधियां हैं, लेकिन वे <a> उत्पन्न करते हैं। मैंने एएसपी.नेट एमवीसी स्रोत कोड में कुछ खुदाई की, लेकिन मुझे सीधा रास्ता नहीं मिला।

समस्या यह है कि उपरोक्त यूआरएल व्यू क्लास का सदस्य है और इसके तत्कालता के लिए इसे कुछ संदर्भों और मार्ग मानचित्रों की आवश्यकता है (जिन्हें मैं नहीं करना चाहता हूं और मुझे वैसे भी नहीं माना जाता है)। वैकल्पिक रूप से, एचटीएमएलहेल्पर क्लास के उदाहरण में कुछ संदर्भ भी हैं जो मुझे लगता है कि यूआरएल इंस्टेंस की संदर्भ जानकारी के सबसेट का रात्रिभोज है (लेकिन फिर से मैं इससे निपटना नहीं चाहता)।

संक्षेप में, मुझे लगता है कि यह संभव है लेकिन सभी तरीकों से मैं देख सकता था, कुछ कम या कम आंतरिक एएसपी.नेट सामान के साथ कुछ हेरफेर शामिल है, मुझे आश्चर्य है कि कोई बेहतर तरीका है या नहीं।

संपादित करें: उदाहरण के लिए, मुझे एक संभावना दिखाई देगी:

public class MyCustomHelper 
{ 
    public static string ExtensionMethod(this HtmlHelper helper) 
    { 
     UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext); 
     urlHelper.Action("Action", "Controller"); 
    } 
} 

लेकिन यह सही प्रतीत नहीं होता है। मैं खुद UrlHelper के उदाहरणों से निपटना नहीं चाहता। एक आसान तरीका होना चाहिए।

+3

मुझे एहसास है कि यह एक सरलीकृत उदाहरण है, लेकिन उदाहरण के लिए मैं एचटीएमएलहेल्पर के बजाय UrlHelper का विस्तार करूंगा। हालांकि, आपके वास्तविक कोड दोनों की आवश्यकता हो सकती है। –

+0

क्षमा करें, मुझे और स्पष्ट होना चाहिए था: मैं एक्सटेंशन विधि में कुछ HTML रीडिंग करना चाहता था और मुझे इसके लिए यूआरएल उत्पन्न करने की आवश्यकता थी। –

उत्तर

206

आप इस के अंदर एचटीएमएल सहायक विस्तार विधि की तरह यूआरएल सहायक बना सकते हैं:

var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 
var url = urlHelper.Action("Home", "Index") 
+0

आह, धन्यवाद। मैंने अभी इसे पोस्ट किया है :-) –

+2

मुझे लगता है कि यह बेहतर होगा अगर कन्स्ट्रक्टर रूटकोलेक्शन 'नया यूआरएलहेल्पर (htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection)' – kpull1

21

तुम भी UrlHelper सार्वजनिक और स्थैतिक कक्षा का उपयोग कर लिंक प्राप्त कर सकते हैं:

UrlHelper.GenerateUrl(null, actionName, controllerName, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true) 

इस उदाहरण तुम नहीं में नया UrlHelper क्लास बनाना है जो थोड़ा सा फायदा हो सकता है।

+0

भी प्रारंभ करता है, मुझे यह जवाब अधिक पसंद है क्योंकि रूट कोलेक्शन सेट करता है। – kpull1

9

यहाँ एक HtmlHelper उदाहरण के UrlHelper प्राप्त करने के लिए मेरी छोटी extenstion विधि है:

public static partial class UrlHelperExtensions 
    { 
     /// <summary> 
     /// Gets UrlHelper for the HtmlHelper. 
     /// </summary> 
     /// <param name="htmlHelper">The HTML helper.</param> 
     /// <returns></returns> 
     public static UrlHelper UrlHelper(this HtmlHelper htmlHelper) 
     { 
      if (htmlHelper.ViewContext.Controller is Controller) 
       return ((Controller)htmlHelper.ViewContext.Controller).Url; 

      const string itemKey = "HtmlHelper_UrlHelper"; 

      if (htmlHelper.ViewContext.HttpContext.Items[itemKey] == null) 
       htmlHelper.ViewContext.HttpContext.Items[itemKey] = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection); 

      return (UrlHelper)htmlHelper.ViewContext.HttpContext.Items[itemKey]; 
     } 
    } 

के रूप में यह प्रयोग करें:

public static MvcHtmlString RenderManagePrintLink(this HtmlHelper helper,) 
{  
    var url = htmlHelper.UrlHelper().RouteUrl('routeName'); 
    //... 
} 

(मैं इस संदर्भ के लिए ही ans पोस्टिंग कर रहा हूँ)
+0

उत्कृष्ट दृष्टिकोण क्योंकि यह एक नया ऑब्जेक्ट बनाने के बजाय मौजूदा ऑब्जेक्ट का पुन: उपयोग करता है। – Mike