12

से Html.ActionLink और Url.Action (...) का उपयोग करके मैं प्री-सेट मानों के साथ एक्शनलिंक प्रस्तुत करने के लिए एक HTMLHelper लिखना चाहता हूं, उदाहरण के लिए।नियंत्रक

<%=Html.PageLink("Page 1", "page-slug");%> 

जहां PageLink एक समारोह है कि एक ज्ञात कार्रवाई और नियंत्रक, जैसे के साथ ActionLink कॉल है। "सूचकांक" और "पृष्ठ"।

HtmlHelper और UrlHelperController या कक्षा के अंदर मौजूद नहीं है, मैं कक्षा के अंदर से किसी कार्रवाई के सापेक्ष URL कैसे प्राप्त करूं?

अद्यतन: उपार्जित अनुभव मैं अब के अतिरिक्त तीन साल को देखते हुए, यहाँ मेरी सलाह है: बस Html.ActionLink("My Link", new { controller = "Page", slug = "page-slug" }) या बेहतर अभी तक,

<a href="@Url.Action("ViewPage", 
        new { 
          controller = "Page", 
          slug = "my-page-slug" })">My Link</a> 

आपका एक्सटेंशन विधि सुंदर और कम हो सकता है का उपयोग करें, लेकिन यह कहते हैं एक और अवांछित बिंदु-विफलता और किसी भी वास्तविक मूल्य को जोड़ने के बिना किराए के लिए एक नई सीखने की आवश्यकता। एक जटिल प्रणाली को डिजाइन करने के रूप में इसके बारे में सोचें। एक और चलती हिस्सा क्यों जोड़ें, जब तक यह विश्वसनीयता (नहीं), पठनीयता (थोड़ा, एक बार जब आप और दस्तावेज़ पढ़ते हैं), गति (कोई नहीं) या समरूपता (कोई नहीं) जोड़ता है।

+0

अद्यतन के लिए +1। मैं भविष्य में खोजकर्ताओं को इस प्रश्न पर 'Url.Action' को कंट्रोलर के अंदर से कॉल करने पर भी इंगित करता हूं - http://stackoverflow.com/questions/2031995/call-urlhelper-in-models-in-asp-net-mvc – brichins

उत्तर

20

सुनिश्चित नहीं है कि मैं वास्तव में आपके प्रश्न को स्पष्ट रूप से समझ गया, लेकिन, मुझे कोशिश करने दो।

की तरह आप वर्णित एक HtmlHelper एक्सटेंशन बनाने के लिए की तरह कुछ प्रयास करें:

using System; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 

namespace Something { 
    public static class PageLinkHelper 
    { 
     public static string PageLink(
      this HtmlHelper helper, 
      string linkText, string actionName, 
      string controllerName, object routeValues, 
      object htmlAttributes) 
     { 
      return helper.ActionLink(
       linkText, actionName, controllerName, 
       routeValues, htmlAttributes); 
     } 
    } 
} 

एक वर्ग से एक URL प्राप्त करने पर अपने प्रश्न के लिए के रूप में, वर्ग किस तरह आप इसे लागू करेंगे पर निर्भर करता है। उदाहरण के लिए, आप वर्तमान नियंत्रक और एक HtmlHelper विस्तार से कार्रवाई प्राप्त करना चाहते हैं, तो आप उपयोग कर सकते हैं:

string currentControllerName = (string)helper.ViewContext 
    .RouteData.Values["controller"]; 
string currentActionName = (string)helper.ViewContext 
    .RouteData.Values["action"]; 

आप एक नियंत्रक से इसे पाने के लिए चाहते हैं, आप आधार वर्ग से गुण/तरीकों का उपयोग कर सकते हैं (नियंत्रक) यूआरएल बनाने के लिए। उदाहरण के लिए:

var url = new UrlHelper(this.ControllerContext.RequestContext); 
url.Action(an_action_name, route_values); 
+1

उत्कृष्ट जवाब। मैंने कोशिश की कि इसे स्थिर वर्ग में लपेटने के बिना और यह सहायक नहीं पंजीकृत होगा। एक्शनलिंक (...)। धन्यवाद। –

+0

आह, और मैं System.Web.Mvc आयात नहीं कर रहा था; मेरी गलती। –