विभिन्न नियंत्रक पर कार्रवाई को कॉल करने के लिए Html.ActionLink का उपयोग करना


224

मैं नियंत्रकों के बीच नेविगेट करने की कोशिश कर रहा हूं ActionLink। मैं अपनी समस्या एक उदाहरण के साथ बताऊंगा।

मैं Hat नियंत्रक के सूचकांक दृश्य पर हूं, और मैं उत्पाद नियंत्रक की विवरण कार्रवाई के लिए एक लिंक बनाने के लिए नीचे दिए गए कोड का उपयोग करने का प्रयास कर रहा हूं।

<%= Html.ActionLink("Details", "Details", "Product", new { id=item.ID }) %>

उत्पाद नियंत्रक पर विवरण के लिए एक लिंक बनाने के बजाय, यह Hat नियंत्रक के तहत विवरण कार्रवाई के लिए एक लिंक बनाता है और इसके अंत में एक लंबा पैरामीटर जोड़ता है:

Hat/Details/9?Length=7

मैं HTML.ActionLinkइस समस्या के कारण नियंत्रकों के बीच स्विच करने के लिए उपयोग करने में सक्षम नहीं हूं । मैं सराहना करूंगा यदि आप मुझे बता सकते हैं कि मैं क्या गलत कर रहा हूं। धन्यवाद

पुनश्च: मैं एमवीसी के साथ आने वाले डिफ़ॉल्ट मार्ग सेटिंग का उपयोग कर रहा हूं

routes.MapRoute("Default", "{controller}/{action}/{id}", 
                     new { controller = "Home", action = "Index", id = "" } );

जवाबों:


409

आप जो चाहते हैं, वह ओवरलोड है:

//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Details", "Details", 
    "Product", new {id = item.ID}, null) %>

1
क्या आप बता सकते हैं कि यह विशेष अधिभार काम क्यों करता है और कोर्की नहीं करता है? HTMLAttributes को शून्य पर सेट करने से लिंक के मार्ग को कैसे प्रभावित होता है?
डेरेक Hunziker

35
ऐसा इसलिए है क्योंकि यदि आप अन्य मापदंडों का उपयोग करते हैं तो यह मान लेता है कि तीसरा तर्क रूटेवल्स है और 4 वाँ तर्क htmlattributes है। 5 वें तर्क को जोड़ने से सही अधिभार का उपयोग करने की विधि मजबूर हो जाती है। इंटेलीजेंस में ओवरलोड के माध्यम से झटका और इससे अधिक समझ में आएगा।
बैनफोर्ड

2
ActionLink का अधिभार वास्तव में अनाड़ी है। रूटवैल्यू कॉलेक्शन के बजाय 'ऑब्जेक्ट रूटवैल्यूज' को स्वीकार करने का पूरा बिंदु टाइपिंग की मात्रा को कम करना है। हालाँकि, आप एक अतिरिक्त नल टाइप करने के लिए अंत। गैर-सहज और काउंटर उत्पादक ...
TiMoch

3
मैं मानता हूं, अधिभार मापदंडों को खराब तरीके से डिज़ाइन किया गया है .. मुझे लगा कि यह सबसे लंबे समय तक एक बग था। मुझे वास्तव में यह समझने के लिए कि मैं गलत हस्ताक्षर का उपयोग कर रहा था, यह समझने के लिए सभी
इंटेलीजेंस में

1
भविष्य के पाठकों के लिए, यदि आप इस मुद्दे को मारते हैं और आप एक सीएसएस शैली जोड़ने की कोशिश कर रहे हैं, तो यह सही अधिभार है। @ Html.ActionLink ("MyText", "MyAction", "MyController", अशक्त, नया {@class = "myClass"})
granadaCoder

17

उस पैरामीटर के साथ आप गलत अतिभारित फ़ंक्शन / विधि को ट्रिगर कर रहे हैं।

मेरे लिए क्या काम किया:

<%= Html.ActionLink("Details", "Details", "Product", new { id=item.ID }, null) %>

यह HtmlHelper.ActionLink (स्ट्रिंग लिंकटेक्स्ट, स्ट्रिंग एक्शननाम, स्ट्रिंग कंट्रोलरनाम, ऑब्जेक्ट रूटवैल्यूज़, ऑब्जेक्ट htmlAttributes) को फायर करता है

मैं MVC 4 का उपयोग कर रहा हूं।

राम-राम!


2
कोड की आपकी लाइन आपके द्वारा उल्लिखित ओवरलोड को ट्रिगर नहीं करती है लेकिन HtmlHelper.ActionLink (स्ट्रिंग लिंकटेक्स्ट, स्ट्रिंग एक्शननाम, ऑब्जेक्ट रूटवैल्यूज़, ऑब्जेक्ट htmlAttributes)। यह वही परिणाम देता है जिससे ओपी बचने की कोशिश कर रहा था। आपको एक अतिरिक्त अशक्त पैरामीटर जोड़ने की आवश्यकता है।
टिमोच

धन्यवाद TiMoch, कि एक याद किया?
स्टीफन वेंटर

12

मैं इन सहायकों को स्पष्टता के लिए नामित मापदंडों का उपयोग करते हुए लिखने की सलाह दूंगा:

@Html.ActionLink(
    linkText: "Details",
    actionName: "Details",
    controllerName: "Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)

2019 तक, यह सुविधा जेटब्रिंस द्वारा रीशर में लागू की गई है। यह वास्तव में इस परिस्थिति के लिए बहुत मददगार है।
जेमी

10

यदि आप MVC फ़्यूचर्स असेंबली (जिसे मैं अत्यधिक सुझाऊंगा) को हड़प लेता हूँ, तो आप रूटलिंक और लैम्बडा बनाते समय रूट का निर्माण करने के लिए जेनेरिक का उपयोग कर सकते हैं:

<%=Html.ActionLink<Product>(c => c.Action( o.Value ), "Details" ) %>

आप यहां फ्यूचर असेंबली प्राप्त कर सकते हैं: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


वास्तविक लिंक के लिए धन्यवाद - इसे खोजने की कोशिश कर रहा था!
पर्थेंटियन

1
हालांकि यह MVC2 में शामिल नहीं है, इसके साथ सावधानी बरतें। तर्क यह है कि कार्य आवश्यक रूप से विधियां नहीं हैं (जो मैं सहमत हूं, लेकिन यह पलायन करने के लिए एक दर्द होने वाला है क्योंकि हम कुछ समय के लिए जेनेरिक विधि का उपयोग कर रहे हैं)। : यहाँ कारण है कि यह 2 में नहीं रखा हो गया है पर पूरा लेख है haacked.com/archive/2008/08/29/...
स्टू

7

आप गलत एक्शनलिंक के अधिभार को मार रहे हैं। इसके बजाय यह प्रयास करें।

<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>


3

एक वैकल्पिक समाधान टैग Urlकी hrefविशेषता सेट करने के लिए सहायक वस्तु का उपयोग करना होगा <a>:

<a href="@Url.Action("Details", "Product",new { id=item.ID }) )">Details</a>

1

ध्यान दें कि विवरण "उत्पाद" फ़ोल्डर के तहत एक "दृश्य" पृष्ठ है।

ProductId तालिका की प्राथमिक कुंजी है। यहाँ Index.cshtml से लाइन है

 @Html.ActionLink("Details", "Details","Products" , new  {  id=item.ProductId  },null)

0

इस कोड ने आंशिक दृश्य में मेरे लिए काम किया:

<a href="/Content/Index?SubCategoryId=@item.Id">@item.Title</a>

हालांकि यह काम करता है, यह एक्शनलिंक का उपयोग करने के पूरे बिंदु को दरकिनार कर देता है ... एक्शनलिंक का पूरा बिंदु मैन्युअल रूप से यूआरएल और संभावित मुद्दों को टाइप करने से बचने के लिए है
जॉन स्टोरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.