এইচটিএমএল.অ্যাকশনলিঙ্ক পদ্ধতি


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 })

যা সাম্প্রতিক এএসপি.নেট এমভিসি অবতারে অবসর নিয়েছে।


17
ডকুমেন্টেশন, এটির জন্য যে কেউ খুঁজছেন: এমএসডিএন.মাইক্রোসফটকম
en-us/library/…

@ ড্যানি থ্যাঙ্কস, আমি এখানে এসে পৌঁছানোর পরে গুগলে এটি খুঁজছিল।
রেই মিয়াসাকা

উত্তর:


491

আমি মনে করি আপনি যা চান তা হ'ল:

এএসপি.নেট এমভিসি 1

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).
                )

এটি নিম্নলিখিত পদ্ধতি অ্যাকশন লিঙ্ক স্বাক্ষর ব্যবহার করে:

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

এএসপি.নেট এমভিসি 2

দুটি যুক্তি চারদিকে পরিবর্তন করা হয়েছে

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).
                )

এটি নিম্নলিখিত পদ্ধতি অ্যাকশন লিঙ্ক স্বাক্ষর ব্যবহার করে:

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

এএসপি.নেট এমভিসি 3 +

যুক্তিগুলি এমভিসি 2 এর মতো একই ক্রমে রয়েছে তবে আইডি মানটির আর প্রয়োজন নেই:

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> 

এটি অনুমান করে আপনাকে নীচের এইচটিএমএল আউটপুট দেবে:

  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
তবে, এটি কি আইটেম / লগইন? আইডি = 5 এর মতো কোনও URL দেয় না?
গুপ্ত

21
আশ্চর্যজনক বিষয়টি যদি আপনি শেষ প্যারামিটারটি মিস করেন তবে এটি আমার জন্য সংযোজনীয়? বর্তমান ক্রিয়ায় দৈর্ঘ্য = 8
ক্রিস এস

32
@ ক্রিস এস - আমি জানি এটি একটি পুরাতন পোস্ট, তবে দৈর্ঘ্য = 8 এর কারণটি হল , nullআপনার আপনার পরে একটি প্যারামিটার থাকা দরকার new { ... }... কারণ আপনি যদি সেই পদ্ধতির ওভারলোডগুলি পরীক্ষা করেন তবে এটি ভাবছে যে আপনার প্যারামিটারগুলি এইচটিএমএল ব্যবস্থা আছে ... রুট আর্গুমেন্ট না। সঠিক পদ্ধতিটি ব্যবহার করার জন্য , আপনাকে এমন পদ্ধতিটি ব্যবহার করতে হবে যা আছে routeArguments, htmlArguments.. সুতরাং শেষেরটি কেবল শূন্যে পাস করুন htmlArgument। এই উত্তরে কোডের প্রথম অংশটিতে এটি রয়েছে। আমি এই পোস্টটি আপডেট করেছি যাতে আপনি সহজেই দেখতে পাবেন (যেমন এটি স্ক্রোল করে না)।
খাঁটি.ক্রোম

7
কেউ এমভিসি 3 দিয়ে এটি চেষ্টা করেছে? দেখে মনে হচ্ছে উপরের নমুনাতে কন্ট্রোলারনাম এবং অ্যাকশনমেডোদ লাইনগুলি উল্টানো হয়েছে। আর কেউ দেখেছেন?
স্টিভ ডুইটসম্যান

8
এমভিসি 3 তে আইডি সম্পত্তিটি পাওয়া যায় না ... পরিবর্তে নিম্নলিখিতটি ব্যবহার করা উচিত:@Html.ActionLink("Text","Action","Controller", new { item.ID }, null)
গ্যাভিন কোটস

30

আমি জোসেফ কিংরির উত্তরে যুক্ত করতে চেয়েছি । তিনি সমাধানটি সরবরাহ করেছিলেন তবে প্রথমে আমি এটি কোনওভাবেই কাজ করতে পারি না এবং আদিপ গুপ্তের মতোই একটি ফলাফল পেয়েছি। এবং তারপরে আমি বুঝতে পেরেছিলাম যে রুটটি প্রথম স্থানে উপস্থিত থাকতে হবে এবং পরামিতিগুলি রুটটির সাথে ঠিক মিল করতে হবে। সুতরাং আমার রুটের জন্য একটি আইডি এবং তারপরে একটি পাঠ্য প্যারামিটার ছিল যা আপনাকেও অন্তর্ভুক্ত করা দরকার।

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

4
এটি কেবল আমার প্রয়োজন - আমি চূড়ান্ত নাল যুক্তি যুক্ত করতে ভুলে গিয়েছিলাম । ধন্যবাদ।
আয়ান অক্সলে

1
রুট প্যারামিটারের নাম থেকেও ম্যাপিং দেখানোর জন্য ধন্যবাদ (যেমন নতুন {আইডি = ..., বার = ...}।
উইলিয়াম রোজ

17

আপনি RouteLink()পদ্ধতিটি দেখতে চাইতে পারেন hat এটি আপনাকে একটি অভিধানের মাধ্যমে সমস্ত কিছু (লিঙ্ক পাঠ্য এবং রুটের নাম বাদে) নির্দিষ্ট করতে দেয়।


4
এটি কীভাবে সমস্যাটি সমাধান করে তার একটি উদাহরণ দেখতে পারা মহান হবে; এমএসডিএন পৃষ্ঠায় প্রচুর ওভারলোড রয়েছে এবং কী কী সন্ধান করা হবে তা বিভ্রান্তিকর হতে পারে
সিমোন মার্টিন

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") 

এটি সত্যই উত্তর হিসাবে চিহ্নিত করা উচিত ছিল যেহেতু প্রশ্নটি জিজ্ঞাসা করা ব্যক্তিটি ঠিক সেভাবেই কাজ করেছিল ... তবে আমি লক্ষ করব যে চিহ্নিত উত্তরটি ব্যবহারকারীর জন্য বিভিন্ন সংস্করণে সঠিকভাবে রুট স্থাপনের ক্ষেত্রে একটি দুর্দান্ত বিবরণে গিয়েছিল did এমভিসি এর।
ইন্ডি-জোনস

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
ফ্যানসিপ্যান্ট শব্দটির দুর্দান্ত ব্যবহার। আমরা যথেষ্ট দেখতে পাচ্ছি না।
gdbj

7

পাঠযোগ্যতার জন্য এবং বিভ্রান্তি এড়ানোর জন্য নামযুক্ত পরামিতি ব্যবহার করুন।

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

1

এমভিসি 5 এর সাথে আমি এটি এটি করে দিয়েছি এবং এটি 100% ওয়ার্কিং কোড ....

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

আপনি ছেলেরা এ থেকে একটি ধারণা পেতে পারেন ...


0

এই ধরণের ব্যবহার:

@ Html.ActionLink ( "MainPage", "সূচক", "বাড়ি")

মেইনপেজ: পাঠ্যের নাম সূচক: অ্যাকশন ভিউ হোম: হোমকন্ট্রোলার

বেস ব্যবহার অ্যাকশন লিঙ্ক

<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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.