c# सी#कोड के अंदर MVC 3 @ Html.ActionLink का उपयोग कैसे करें




asp.net-mvc asp.net-mvc-3 (4)

मैं एटी # फ़ंक्शन के अंदर @ एचटीएमएल.एक्शनलिंक विधि को कॉल करना चाहता हूं ताकि उस पर एक लिंक के साथ स्ट्रिंग लौटा जा सके।

कुछ इस तरह:

string a = "Email is locked, click " + @Html.ActionLink("here to unlock.", "unlock") ;

शायद यह प्रयास करें:

string a = "Email is locked, click " + System.Web.Mvc.Html.LinkExtensions.ActionLink("here to unlock.", "unlock");

मान लें कि आप इसे अपने नियंत्रक में पूरा करना चाहते हैं, इसके माध्यम से कूदने के लिए कई हुप्स हैं। आपको एक ViewDataDictionary और एक TempDataDictionary को इन्स्तांत करना होगा। उसके बाद आपको ControllerContext IView लेने और एक IView बनाने की IView । अंत में, आप इन सभी तत्वों (प्लस अपने RouteCollection ) का उपयोग करके अपने HtmlHelper बनाने के लिए तैयार हैं।

एक बार जब आप यह सब करते हैं, तो आप अपनी कस्टम लिंक बनाने के लिए LinkExtensions.ActionLink का उपयोग कर सकते हैं। आपके विचार में, आपको एचटीएमएल एन्कोडेड होने से रोकने के लिए अपने लिंक को प्रदर्शित करने के लिए @Html.Raw() का उपयोग करना होगा। यहां आवश्यक कोड है:

var vdd = new ViewDataDictionary();
var tdd = new TempDataDictionary();
var controllerContext = this.ControllerContext;
var view = new RazorView(controllerContext, "/", "/", false, null);
var html = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()),
     new ViewDataContainer(vdd), RouteTable.Routes);
var a = "Email is locked, click " + LinkExtensions.ActionLink(html, "here to unlock.", "unlock", "controller").ToString();

यह सब दिखाते हुए, मैं आपको सावधानी से आगाह करता हूं कि यह आपके विचार में करने के लिए एक बेहतर विचार है। अपने ViewModel को त्रुटि और अन्य जानकारी जोड़ें, फिर लिंक बनाने के लिए अपने दृश्य को कोडित करें। यदि यह एकाधिक दृश्यों के लिए आवश्यक है, तो लिंक निर्माण करने के लिए एक HtmlHelper बनाएं।

अद्यतन करें

One.beat.consumer को संबोधित करने के लिए, मेरा प्रारंभिक जवाब यह था कि क्या संभव है। यदि डेवलपर को इस तकनीक का पुन: उपयोग करने की आवश्यकता है, तो जटिलता एक स्थिर सहायक में छिपाई जा सकती है, जैसे:

public static class ControllerHtml
{
    // this class from internal TemplateHelpers class in System.Web.Mvc namespace
    private class ViewDataContainer : IViewDataContainer
    {
        public ViewDataContainer(ViewDataDictionary viewData)
        {
            ViewData = viewData;
        }

        public ViewDataDictionary ViewData { get; set; }
    }

    private static HtmlHelper htmlHelper;

    public static HtmlHelper Html(Controller controller)
    {
        if (htmlHelper == null)
        {
            var vdd = new ViewDataDictionary();
            var tdd = new TempDataDictionary();
            var controllerContext = controller.ControllerContext;
            var view = new RazorView(controllerContext, "/", "/", false, null);
            htmlHelper = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()),
                 new ViewDataContainer(vdd), RouteTable.Routes);
        }
        return htmlHelper;
    }

    public static HtmlHelper Html(Controller controller, object model)
    {
        if (htmlHelper == null || htmlHelper.ViewData.Model == null || !htmlHelper.ViewData.Model.Equals(model))
        {
            var vdd = new ViewDataDictionary();
            vdd.Model = model;
            var tdd = new TempDataDictionary();
            var controllerContext = controller.ControllerContext;
            var view = new RazorView(controllerContext, "/", "/", false, null);
            htmlHelper = new HtmlHelper(new ViewContext(controllerContext, view, vdd, tdd, new StringWriter()),
                 new ViewDataContainer(vdd), RouteTable.Routes);
        }
        return htmlHelper;
    }
}

फिर, नियंत्रक में, इसका उपयोग इस प्रकार किया जाता है:

var a = "Email is locked, click " + 
    ControllerHtml.Html(this).ActionLink("here to unlock.", "unlock", "controller").ToString();

या ऐसा करना:

var model = new MyModel();
var text = ControllerHtml.Html(this, model).EditorForModel();

Url.Action का प्रयोग करना आसान है। Url.Action , यह अब एक शक्तिशाली उपकरण में फैलता है, जो कि नियंत्रक के भीतर किसी भी मार्क-अप को पूरे HtmlHelpers (पूर्ण इंटेलिसेंस के साथ) का उपयोग करता है।

उपयोग की संभावनाओं में ईमेल, पीडीएफ पीढ़ी, ऑन-लाइन दस्तावेज़ वितरण, आदि के लिए मॉडल और संपादक टेम्पलेट्स का उपयोग करके मार्क-अप बनाना शामिल है।


नियंत्रक में उपलब्ध यूआरएल हेल्पर का प्रयोग करके मैन्युअल रूप से लिंक का निर्माण करना आपकी सबसे अच्छी शर्त है। यह कहते हुए कि, मुझे संदेह है कि संभवत: इसे किसी दृश्य या आंशिक दृश्य में साझा करने या अन्यथा साझा करने का एक बेहतर तरीका है।

string a = "Email is locked, click <a href=\""
              + Url.Action( "unlock" )
              + "\">here to unlock.</a>";

आप एक HtmlHelper एक्सटेंशन विधि बना सकते हैं:

public static string GetUnlockText(this HtmlHelper helper)
{
    string a = "Email is locked, click " + helper.ActionLink("here to unlock.", "unlock");
    return a;
}

या यदि आप एक एएसपीएक्स पृष्ठ के दायरे के बाहर इस लिंक को उत्पन्न करने के लिए कहते हैं तो आपको एक HtmlHelper के लिए संदर्भ बनाने और उसके बाद जनरेट करना होगा। मैं यह एक UrlUtility स्थिर कक्षा में (मैं जानता हूँ, लोगों को स्थैतिक वर्गों और शब्द उपयोगिता को नफरत है, लेकिन ध्यान केंद्रित करने की कोशिश)। आवश्यकतानुसार अधिभार:

public static string ActionLink(string linkText, string actionName, string controllerName)
{
    var httpContext = new HttpContextWrapper(System.Web.HttpContext.Current);
    var requestContext = new RequestContext(httpContext, new RouteData());
    var urlHelper = new UrlHelper(requestContext);

    return urlHelper.ActionLink(linkText, actionName, controllerName, null);
}

फिर आप जहां भी दिल चाहते हैं, वहां से निम्नलिखित को लिख सकते हैं:

string a = "Email is locked, click " + UrlUtility.ActionLink("here to unlock.", "unlock", "controller");




html.actionlink