HTML हेल्पर में URL जनरेट करें


168

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

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

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

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

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

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

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

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

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

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


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

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

जवाबों:


217

आप HTML सहायक एक्सटेंशन विधि के अंदर इस तरह url हेल्पर बना सकते हैं:

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

2
मुझे लगता है कि यह बेहतर होगा अगर कंस्ट्रक्टर भी रूटnew UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection)
इलेक्शन को

22

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

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

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


मुझे यह उत्तर अधिक पसंद है क्योंकि रूटकॉलिनेशन सेट करता है।
kpull1

10

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

  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 केवल संदर्भ के लिए पोस्ट कर रहा हूं)


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

हम ASP.NET 4.5 का उपयोग कर रहे हैं और पुन: प्रवेश समस्याओं का सामना कर रहे थे। हमें विश्वास नहीं है कि UrlHelper http अनुरोधों के लिए पुन: प्रयोज्य है। कृपया ध्यान दें।
कार्ल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.