एक ASP.NET MVC Html.ActionLink में एक एंकर टैग सहित


151

ASP.NET MVC में, मैं एक लिंक बनाने की कोशिश कर रहा हूं जिसमें एक एंकर टैग शामिल है (जो उपयोगकर्ता को एक पृष्ठ पर निर्देशित कर रहा है, और पृष्ठ का एक विशिष्ट अनुभाग)।

मैं जिस URL को बनाने का प्रयास कर रहा हूं, वह निम्नलिखित जैसा होना चाहिए:

<a href="/category/subcategory/1#section12">Title for a section on the page</a>

मेरी रूटिंग मानक के साथ सेट की गई है:

routes.MapRoute("Default", "{controller}/{action}/{categoryid}"); 

मेरे द्वारा उपयोग की जा रही क्रिया लिंक सिंटैक्स है:

<%foreach (Category parent in ViewData.Model) { %>
<h3><%=parent.Name %></h3>
<ul>
<%foreach (Category child in parent.SubCategories) { %>
    <li><%=Html.ActionLink<CategoryController>(x => x.Subcategory(parent.ID), child.Name) %></li>
<%} %>
</ul>
<%} %>

मेरी नियंत्रक विधि इस प्रकार है:

public ActionResult Subcategory(int categoryID)
{
   //return itemList

   return View(itemList);
}

उपरोक्त सही ढंग से एक URL इस प्रकार लौटाता है:

<a href="/category/subcategory/1">Title for a section on the page</a>

मैं यह पता नहीं लगा सकता कि # अनुभाग 12 भाग को कैसे जोड़ा जाए । "सेक्शन" शब्द सिर्फ कन्वेंशन है जो मैं पेज सेक्शन को तोड़ने के लिए उपयोग कर रहा हूं, और 12 उपश्रेणी की ID है, अर्थात, child.ID।

मैं यह कैसे कर सकता हूँ?

जवाबों:


97

मैं शायद इस तरह मैन्युअल रूप से लिंक का निर्माण करूंगा:

<a href="<%=Url.Action("Subcategory", "Category", new { categoryID = parent.ID }) %>#section12">link text</a>

20
वास्तव में ActionLink के लिए ओवरलोड का उपयोग करना चाहिए जैसा कि @ ब्रैड विल्सन द्वारा वर्णित है।
मटेरुमा

18
@ मट्ट्रुमा सॉरी मैं असहमत हूं। चुम्मा। मापदंडों से भरा सदस्य क्यों है, जिनमें से कुछ शून्य के रूप में छोड़ दिए जाते हैं, जब आप इसे स्पष्ट रूप से बता सकते हैं। कोई भी देख सकता है कि उपरोक्त का क्या मतलब है जिसके तहत ब्रैड की प्रतिक्रिया जटिल है और आपको इंटेलीजेंस में खुदाई करने की आवश्यकता है। बहुत सारे पैरामीटर एक मान्यता प्राप्त विरोधी पैटर्न है .. c2.com/cgi/wiki?TooManyParameters
Ed Blackburn 14

2
मैं सहमत हूँ। दोनों तरीके काम करते हैं, लेकिन चूंकि जिस तरह से URL में टुकड़े निर्दिष्ट हैं, निकट भविष्य में बदलने वाले नहीं हैं, मुझे लगता है कि यह तरीका वास्तव में अधिक पठनीय है और इसके इरादे में स्पष्ट है। यदि आवश्यक हो, तो आप अभी भी कस्टम विधि के साथ Urlया Htmlऑब्जेक्ट का विस्तार कर सकते हैं जिसमें एक टुकड़ा जोड़ने का एक सरल तरीका शामिल है।
लोरेन्ज़कैम

282

एक्शनलिंक के ओवरलोड हैं जो एक खंड पैरामीटर लेते हैं । आपके खंड के रूप में "सेक्शन 12" पास करने से आपको वह व्यवहार मिलेगा जो आप बाद में कर रहे हैं।

उदाहरण के लिए, LinkExtensions.ActionLink मेथड (HtmlHelper, String, String, String, String, String, Object, Object) को कॉल करना :

<%= Html.ActionLink("Link Text", "Action", "Controller", null, null, "section12-the-anchor", new { categoryid = "blah"}, null) %>

1
क्या ये ओवरलोड एक एक्सटेंशन लाइब्रेरी का हिस्सा हैं? मैं उन्हें पाने के लिए प्रतीत नहीं होता।
ग्रेनेड

दो हैं: सार्वजनिक स्थैतिक स्ट्रिंग एक्शनलिंक (यह HtmlHelper htmlHelper, string linkText, string actionName, string नियंत्रक नाम, स्ट्रिंग प्रोटोकॉल, स्ट्रिंग होस्टनाम, स्ट्रिंग टुकड़ा, ऑब्जेक्ट रूटवैल्यूज़, ऑब्जेक्ट htmlAttributes); सार्वजनिक स्थैतिक स्ट्रिंग एक्शनलिंक (यह HtmlHelper htmlHelper, string linkText, string ActionName, string नियंत्रक नाम, स्ट्रिंग प्रोटोकॉल, स्ट्रिंग होस्टनाम, स्ट्रिंग टुकड़ा, रूटवैल्यूडर रूटValues, IDEDIA <string, object> htmlAttributes);
ब्रैड विल्सन

11
इसका उत्तर होना चाहिए।
मरिउज़ो

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

1
@RobertMcKee यदि आपका लिंक टेक्स्ट सिर्फ टेक्स्ट से अधिक है, तो Html.ActionLink()किसी भी परिदृश्य में काम नहीं करेगा - आपको href=@Url.Action()सिंटैक्स सिंटैक्स का उपयोग करने की आवश्यकता होगी ।
कैटस्टेवेंस

15

मुझे याद नहीं है कि ASP.NET MVC (ASP.NET MVC 3+ के किस संस्करण में) मुझे विश्वास है कि / रेज़र पैरामीटर लॉरबैडलेक्लेरेशन या जिसे यह कहा जाता है (पैरामीटर: x) फीचर पेश किया गया था, लेकिन मेरे लिए यह निश्चित रूप से उचित तरीका है ASP.NET MVC में एक एंकर के साथ एक लिंक बनाएँ।

@Html.ActionLink("Some link text", "MyAction", "MyController", protocol: null, hostName: null, fragment: "MyAnchor", routeValues: null, htmlAttributes: null)

एड ब्लैकबर्न से एंटीपार्टर्न तर्क भी नहीं इस उत्तर सकता है।


1
सचमुच इससे मेरी जान बच गई। अपने पद को मेरे समाधान के रूप में यहां प्रस्तुत करना stackoverflow.com/questions/32420028/…
मैथ्यू

11

मैंने इसे इस तरह किया है:

<a href="@Url.Action("Index","Home")#features">Features</a>

1

यहाँ वास्तविक जीवन उदाहरण है

@Html.Grid(Model).Columns(columns =>
    {
           columns.Add()
                   .Encoded(false)
                   .Sanitized(false)
                   .SetWidth(10)
                   .Titled(string.Empty)
                   .RenderValueAs(x => @Html.ActionLink("Edit", "UserDetails", "Membership", null, null, "discount", new { @id = @x.Id }, new { @target = "_blank" }));

  }).WithPaging(200).EmptyText("There Are No Items To Display")

और टारगेट पेज पर TABS है

<ul id="myTab" class="nav nav-tabs" role="tablist">

        <li class="active"><a href="#discount" role="tab" data-toggle="tab">Discount</a></li>
    </ul>

0

जब तक आप हमेशा उपचारात्मक कार्रवाई विधि में ActionFilter को लागू करते हैं, तब तक मेरा समाधान काम करेगा, जब तक आप हमेशा उपयोगकर्ता को उसी बुकमार्क पर पुनर्निर्देशित करना चाहते हैं:

http://spikehd.blogspot.com/2012/01/mvc3-redirect-action-to-html-bookmark.html

यह HTML बफर को संशोधित करता है और बुकमार्क को संलग्न करने के लिए ब्राउज़र को निर्देश देने के लिए जावास्क्रिप्ट के एक छोटे टुकड़े को आउटपुट करता है।

आप पाठ्यक्रम में URL में बुकमार्क का उपयोग करने के बजाय, मैन्युअल रूप से स्क्रॉल करने के लिए जावास्क्रिप्ट को संशोधित कर सकते हैं!

आशा करता हूँ की ये काम करेगा :)


0

मैंने ऐसा किया है और यह दूसरे दृष्टिकोण के लिए पुनर्निर्देशन के लिए काम करता है मुझे लगता है कि अगर आप काम करेंगे इसके बाद #sectionLink जोड़ें

<a class="btn yellow" href="/users/Create/@Model.Id" target="_blank">
                                        Add As User
                                    </a>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.