HTML.ActionLink विधि


249

मान लीजिए कि मेरे पास एक क्लास है

public class ItemController:Controller
{
    public ActionResult Login(int id)
    {
        return View("Hi", id);
    }
}

आइटम फ़ोल्डर में स्थित पृष्ठ पर, जहां ItemControllerरहता है, मैं Loginविधि के लिए एक लिंक बनाना चाहता हूं । तो Html.ActionLinkमुझे किस विधि का उपयोग करना चाहिए और मुझे कौन से पैरामीटर पास करने चाहिए?

विशेष रूप से, मैं विधि के प्रतिस्थापन की तलाश में हूं

Html.ActionLink(article.Title,
    new { controller = "Articles", action = "Details",
          id = article.ArticleID })

कि हाल ही में ASP.NET MVC अवतार में सेवानिवृत्त हो गया है।


17
दस्तावेज़ीकरण, किसी को भी इसकी तलाश में: msdn.microsoft.com/en-us/library/…
BlueRaja - Danny Pflughoeft

@ डैनी थैंक्स, जब मैं यहां समाप्त हुआ, तो Google पर इसे देख रहा था।
री मियासाका

जवाबों:


491

मुझे लगता है कि आप क्या चाहते हैं:

ASP.NET MVC1

Html.ActionLink(article.Title, 
                "Login",  // <-- Controller Name.
                "Item",   // <-- ActionMethod
                new { id = article.ArticleID }, // <-- Route arguments.
                null  // <-- htmlArguments .. which are none. You need this value
                      //     otherwise you call the WRONG method ...
                      //     (refer to comments, below).
                )

यह निम्न विधि ActionLink हस्ताक्षर का उपयोग करता है:

public static string ActionLink(this HtmlHelper htmlHelper, 
                                string linkText,
                                string controllerName,
                                string actionName,
                                object values, 
                                object htmlAttributes)

ASP.NET MVC2

दो तर्कों को चारों ओर घुमाया गया है

Html.ActionLink(article.Title, 
                "Item",   // <-- ActionMethod
                "Login",  // <-- Controller Name.
                new { id = article.ArticleID }, // <-- Route arguments.
                null  // <-- htmlArguments .. which are none. You need this value
                      //     otherwise you call the WRONG method ...
                      //     (refer to comments, below).
                )

यह निम्न विधि ActionLink हस्ताक्षर का उपयोग करता है:

public static string ActionLink(this HtmlHelper htmlHelper, 
                                string linkText,
                                string actionName,
                                string controllerName,
                                object values, 
                                object htmlAttributes)

ASP.NET MVC3 +

तर्क MVC2 के समान क्रम में हैं, हालाँकि आईडी मान की अब आवश्यकता नहीं है:

Html.ActionLink(article.Title, 
                "Item",   // <-- ActionMethod
                "Login",  // <-- Controller Name.
                new { article.ArticleID }, // <-- Route arguments.
                null  // <-- htmlArguments .. which are none. You need this value
                      //     otherwise you call the WRONG method ...
                      //     (refer to comments, below).
                )

यह लिंक में किसी भी रूटिंग लॉजिक को हार्ड-कोडिंग से बचाता है।

 <a href="/Item/Login/5">Title</a> 

यह मानते हुए आपको निम्न html आउटपुट देगा:

  1. article.Title = "Title"
  2. article.ArticleID = 5
  3. आपके पास अभी भी निम्नलिखित मार्ग निर्धारित है

। ।

routes.MapRoute(
    "Default",     // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

7
लेकिन, क्या इससे कोई URL नहीं मिलता है जैसे / Item / Login? Id = 5?
आदिप गुप्ता

21
क्या अजीब है अगर आप पिछले पैरामीटर को याद करते हैं, तो यह मेरे लिए उपयुक्त है? वर्तमान कार्रवाई के लिए लंबाई = 8
क्रिस एस

32
@ क्रिस एस - मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन इसका कारण? लंबाई = 8 है क्योंकि आपको , nullअपने पैरामीटर के बारे में जानने की आवश्यकता है new { ... }... क्योंकि यदि आप उस पद्धति के ओवरलोड की जांच करते हैं, तो यह सोच रहा है कि आपके पैरामीटर htmlAguguments हैं ... मार्ग तर्क नहीं। सही विधि का उपयोग करने के लिए , यू के पास उस विधि का उपयोग करने की आवश्यकता है routeArguments, htmlArguments.. तो बस उस अंतिम के लिए शून्य में पास करें htmlArgument। इस उत्तर में कोड का पहला टुकड़ा है। मैंने इस पोस्ट को अपडेट किया है ताकि आप आसानी से देख सकें (यानी यह स्क्रॉल नहीं करता है)।
प्योर.क्रोम

7
किसी ने MVC 3 के साथ यह कोशिश की है? ऐसा लगता है कि ऊपर के नमूने में कंट्रोलरनाम और एक्शनमेथोड लाइनें फ़्लिप हैं। किसी और को देखा है कि?
स्टीव ड्यूइट्समैन

8
MVC3 में आईडी संपत्ति नहीं मिली है ... इसके बजाय निम्नलिखित का उपयोग किया जाना चाहिए:@Html.ActionLink("Text","Action","Controller", new { item.ID }, null)
गेविन Coates

30

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

Html.ActionLink(article.Title, "Login", "Item", new { id = article.ArticleID, title = article.Title }, null)

4
यह वही है जो मुझे चाहिए था - मैं अंतिम अशक्त तर्क को जोड़ना भूल गया था । धन्यवाद।
इयान ऑक्ले

1
मार्ग पैरामीटर नाम से मैपिंग दिखाने के लिए धन्यवाद, भी (जैसे नया {आईडी = ..., बार = ...}।
विलियम रोज

17

आप RouteLink()विधि को देखना चाहते हैं। क्या आप एक शब्दकोश के माध्यम से सब कुछ निर्दिष्ट कर सकते हैं (लिंक पाठ और मार्ग नाम को छोड़कर)।


4
इस मुद्दे को हल करने के तरीके को देखने के लिए बहुत अच्छा होगा; MSDN पेज में बहुत सारे अधिभार हैं और यह जानना कि क्या देखना दूभर हो सकता है
साइमन मार्टिन

14

मुझे लगता है कि यूसुफ ने नियंत्रक और कार्रवाई को फ़्लिप किया। पहले एक्शन आता है फिर कंट्रोलर। यह कुछ अजीब है, लेकिन जिस तरह से हस्ताक्षर दिखता है।

बस चीजों को स्पष्ट करने के लिए, यह वह संस्करण है जो काम करता है (जोसेफ के उदाहरण का अनुकूलन):

Html.ActionLink(article.Title, 
    "Login",  // <-- ActionMethod
    "Item",   // <-- Controller Name
    new { id = article.ArticleID }, // <-- Route arguments.
    null  // <-- htmlArguments .. which are none
    )

11

इस बारे में क्या

<%=Html.ActionLink("Get Involved", 
                   "Show", 
                   "Home", 
                   new 
                       { 
                           id = "GetInvolved" 
                       }, 
                   new { 
                           @class = "menuitem", 
                           id = "menu_getinvolved" 
                       }
                   )%>

10
Html.ActionLink(article.Title, "Login/" + article.ArticleID, 'Item") 

यह वास्तव में उत्तर के रूप में चिह्नित किया जाना चाहिए था क्योंकि यह वही करता है जो सवाल पूछने वाले व्यक्ति की तलाश में था ... हालांकि मैं ध्यान दूंगा कि चिह्नित उत्तर उपयोगकर्ता के लिए विभिन्न संस्करणों में मार्गों को सही ढंग से स्थापित करने के लिए एक महान विवरण में गया था। MVC का।
इंडी-जोन्स

9

यदि आप सभी फैंसी-पैंट में जाना चाहते हैं, तो यहां बताया गया है कि आप इसे कैसे कर सकते हैं:

@(Html.ActionLink<ArticlesController>(x => x.Details(), article.Title, new { id = article.ArticleID }))

आपको इसे System.Web.Mvcनाम स्थान में रखना होगा :

public static class MyProjectExtensions
{
    public static MvcHtmlString ActionLink<TController>(this HtmlHelper htmlHelper, Expression<Action<TController>> expression, string linkText)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

        var link = new TagBuilder("a");

        string actionName = ExpressionHelper.GetExpressionText(expression);
        string controllerName = typeof(TController).Name.Replace("Controller", "");

        link.MergeAttribute("href", urlHelper.Action(actionName, controllerName));
        link.SetInnerText(linkText);

        return new MvcHtmlString(link.ToString());
    }

    public static MvcHtmlString ActionLink<TController, TAction>(this HtmlHelper htmlHelper, Expression<Action<TController, TAction>> expression, string linkText, object routeValues)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

        var link = new TagBuilder("a");

        string actionName = ExpressionHelper.GetExpressionText(expression);
        string controllerName = typeof(TController).Name.Replace("Controller", "");

        link.MergeAttribute("href", urlHelper.Action(actionName, controllerName, routeValues));
        link.SetInnerText(linkText);

        return new MvcHtmlString(link.ToString());
    }

    public static MvcHtmlString ActionLink<TController>(this HtmlHelper htmlHelper, Expression<Action<TController>> expression, string linkText, object routeValues, object htmlAttributes) where TController : Controller
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

        var attributes = AnonymousObjectToKeyValue(htmlAttributes);

        var link = new TagBuilder("a");

        string actionName = ExpressionHelper.GetExpressionText(expression);
        string controllerName = typeof(TController).Name.Replace("Controller", "");

        link.MergeAttribute("href", urlHelper.Action(actionName, controllerName, routeValues));
        link.MergeAttributes(attributes, true);
        link.SetInnerText(linkText);

        return new MvcHtmlString(link.ToString());
    }

    private static Dictionary<string, object> AnonymousObjectToKeyValue(object anonymousObject)
    {
        var dictionary = new Dictionary<string, object>();

        if (anonymousObject == null) return dictionary;

        foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(anonymousObject))
        {
            dictionary.Add(propertyDescriptor.Name, propertyDescriptor.GetValue(anonymousObject));
        }

        return dictionary;
    }
}

इसमें दो ओवरराइड शामिल हैं Route Valuesऔर HTML Attributes, आपके सभी विचारों को जोड़ने की आवश्यकता होगी: @using YourProject.Controllersया आप इसे अपने लिए जोड़ सकते हैंweb.config <pages><namespaces>


1
मुझे आश्चर्य है कि इस दृष्टिकोण का उपयोग न करें। यह एक नियंत्रक / कार्रवाई का प्रतिनिधित्व करने के लिए अपने विचारों में स्ट्रिंग शाब्दिक का उपयोग करने के लिए वास्तव में खतरनाक लगता है।
जॉनथॉन सुलिंगर

यह सब मेरे जीवन की तलाश में है
वर्थ 7

कोशिश की, यह काम नहीं किया। मुझे अंत में एक रिक्त स्ट्रिंग दिया - मुझे लगता है क्योंकि मेरे कार्यों में पैरामीटर हैं।
वर्थि 7

क्या आप इस कोड के साथ एक गीथूब या अन्य स्थान पोस्ट कर सकते हैं ताकि मैं देखूं और देखूं कि यह आपके लिए काम क्यों नहीं कर रहा है?
सर्ज सगन

2
शब्द fancypants का अच्छा उपयोग। हम यह पर्याप्त नहीं देखते हैं।
gdbj

7

पठनीयता के लिए नामित नाम का उपयोग करें और भ्रम से बचें।

@Html.ActionLink(
            linkText: "Click Here",
            actionName: "Action",
            controllerName: "Home",
            routeValues: new { Identity = 2577 },
            htmlAttributes: null)

1

MVC5 के साथ मैंने इसे इस तरह किया है और यह 100% काम करने वाला कोड है ...।

@Html.ActionLink(department.Name, "Index", "Employee", new { 
                            departmentId = department.DepartmentID }, null)

आप लोग इससे अंदाजा लगा सकते हैं ...


0

इस प्रकार का उपयोग करें:

@ Html.ActionLink ( "mainpage", "सूचकांक", "घर")

मेनपेज: टेक्स्ट इंडेक्स का नाम: एक्शन व्यू होम: होमकंट्रोलर

आधार का उपयोग करें ActionLink

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>_Layout</title>
    <link href="@Url.Content("~/Content/bootsrap.min.css")" rel="stylesheet" type="text/css" />
</head>
<body>
    <div class="container">
        <div class="col-md-12">
            <button class="btn btn-default" type="submit">@Html.ActionLink("AnaSayfa","Index","Home")</button>
            <button class="btn btn-default" type="submit">@Html.ActionLink("Hakkımızda", "Hakkimizda", "Home")</button>
            <button class="btn btn-default" type="submit">@Html.ActionLink("Iletişim", "Iletisim", "Home")</button>
        </div> 
        @RenderBody()
        <div class="col-md-12" style="height:200px;background-image:url(/img/footer.jpg)">

        </div>
    </div>
</body>
</html>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.