Metode HTML.ActionLink

249

Katakanlah saya punya kelas

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

Pada halaman yang tidak terletak di folder Item, di mana ItemControllerberada, saya ingin membuat tautan ke Loginmetode. Jadi Html.ActionLinkmetode mana yang harus saya gunakan dan parameter apa yang harus saya lewati?

Secara khusus, saya mencari pengganti metode ini

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

yang telah pensiun dalam inkarnasi ASP.NET MVC baru-baru ini.

Graviton
sumber
17
Dokumentasi, bagi siapa pun yang mencarinya: msdn.microsoft.com/en-us/library/…
BlueRaja - Danny Pflughoeft
@Danny Terima kasih, sedang mencarinya di Google ketika saya berakhir di sini.
Rei Miyasaka

Jawaban:

491

Saya pikir yang Anda inginkan adalah ini:

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

Ini menggunakan metode tanda tangan ActionLink berikut:

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

ASP.NET MVC2

dua argumen telah diubah

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

Ini menggunakan metode tanda tangan ActionLink berikut:

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

ASP.NET MVC3 +

argumen dalam urutan yang sama dengan MVC2, namun nilai id tidak lagi diperlukan:

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

Ini menghindari pengodean logika perutean ke tautan.

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

Ini akan memberi Anda output html berikut, dengan asumsi:

  1. article.Title = "Title"
  2. article.ArticleID = 5
  3. Anda masih memiliki rute berikut yang ditentukan

. .

routes.MapRoute(
    "Default",     // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);
Joseph Kingry
sumber
7
Tapi, bukankah ini memberikan URL seperti / Item / Login? Id = 5?
Adhip Gupta
21
Apa yang aneh adalah jika Anda melewatkan parameter terakhir, itu menambahkan bagi saya? Panjang = 8 untuk tindakan saat ini
Chris S
32
@ Chris S - Saya tahu ini adalah posting lama, tetapi alasan untuk? Panjang = 8 adalah karena Anda perlu memiliki , nullparameter SETELAH Anda new { ... }... karena jika Anda memeriksa kelebihan metode itu, ia berpikir parameter Anda htmlArguments ... bukan merutekan argumen. Untuk menggunakan metode yang benar , Anda harus menggunakan metode yang memiliki routeArguments, htmlArguments.. jadi masukkan saja nol untuk yang terakhir htmlArgument. Potongan kode pertama dalam balasan ini adalah miliknya. Saya telah memperbarui posting ini sehingga Anda dapat melihatnya dengan mudah (mis. Tidak menggulir).
Pure.Krome
7
Adakah yang pernah mencoba ini dengan MVC 3? Tampaknya garis ControllerName dan ActionMethod dalam sampel di atas dibalik. Adakah yang melihat itu?
Steve Duitsman
8
Di MVC3, properti id tidak ditemukan ... yang berikut ini seharusnya digunakan:@Html.ActionLink("Text","Action","Controller", new { item.ID }, null)
Gavin Coates
30

Saya ingin menambahkan jawaban Joseph Kingry . Dia memberikan solusi tetapi pada awalnya saya tidak bisa membuatnya bekerja dan mendapatkan hasil seperti Adhip Gupta. Dan kemudian saya menyadari bahwa rute harus ada di tempat pertama dan parameter harus sesuai dengan rute tersebut. Jadi saya punya id dan kemudian parameter teks untuk rute saya yang juga perlu dimasukkan juga.

Html.ActionLink(article.Title, "Login", "Item", new { id = article.ArticleID, title = article.Title }, null)
Jeff Widmer
sumber
4
Inilah yang saya butuhkan - saya lupa menambahkan argumen nol akhir . Terima kasih.
Ian Oxley
1
Terima kasih telah menunjukkan pemetaan dari nama parameter rute juga (mis. Baru {id = ..., bar = ...}.
William Rose
17

Anda mungkin ingin melihat metode RouteLink(). Yang memungkinkan Anda menentukan semuanya (kecuali teks tautan dan nama rute) melalui kamus.

Haacked
sumber
4
Akan bagus untuk melihat contoh bagaimana hal itu menyelesaikan masalah; halaman MSDN memiliki banyak kelebihan dan mengetahui apa yang harus dicari bisa membingungkan
Simon Martin
14

Saya pikir Joseph membalikkan kendali dan tindakan. Pertama datang aksi kemudian controller. Ini agak aneh, tetapi cara tanda tangan terlihat.

Hanya untuk memperjelas beberapa hal, ini adalah versi yang berfungsi (adaptasi dari contoh Joseph):

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

bagaimana dengan ini

<%=Html.ActionLink("Get Involved", 
                   "Show", 
                   "Home", 
                   new 
                       { 
                           id = "GetInvolved" 
                       }, 
                   new { 
                           @class = "menuitem", 
                           id = "menu_getinvolved" 
                       }
                   )%>
Hasan
sumber
10
Html.ActionLink(article.Title, "Login/" + article.ArticleID, 'Item") 
Adhip Gupta
sumber
Ini benar-benar harus ditandai sebagai jawaban karena ia melakukan persis apa yang dicari orang yang mengajukan pertanyaan ... namun saya akan mencatat bahwa jawaban yang ditandai memang masuk ke detail yang sangat besar bagi pengguna dalam mengatur rute dengan benar dalam berbagai versi dengan benar dari MVC.
Indy-Jones
9

Jika Anda ingin menggunakan semua celana panjang mewah, inilah cara Anda dapat mengembangkannya untuk dapat melakukan ini:

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

Anda harus meletakkan ini di System.Web.Mvcnamespace:

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

Ini mencakup dua penggantian untuk Route Valuesdan HTML Attributes, juga, semua tampilan Anda perlu ditambahkan: @using YourProject.Controllersatau Anda dapat menambahkannya keweb.config <pages><namespaces>

Serj Sagan
sumber
1
Saya terkejut lebih tidak menggunakan pendekatan ini. Tampaknya sangat berbahaya untuk menggunakan string literal di seluruh tampilan Anda untuk mewakili controller / action.
Johnathon Sullinger
Telah mencari ini sepanjang hidupku
Worthy7
Mencoba ini, tidak berhasil. Memberi saya string kosong pada akhirnya - saya berasumsi karena saya memiliki parameter dalam fungsi saya.
Layak
Bisakah Anda memposting github atau tempat lain dengan kode ini sehingga saya bisa melihatnya dan melihat mengapa itu tidak bekerja untuk Anda?
Serj Sagan
2
Penggunaan kata fancypants. Kami tidak cukup melihatnya.
gdbj
7

Gunakan parameter bernama untuk keterbacaan dan untuk menghindari kebingungan.

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

Dengan MVC5 saya telah melakukannya seperti ini dan itu adalah kode kerja 100% ....

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

Kalian bisa mendapatkan ide dari ini ...

Sohail Malik
sumber
0

Jenis ini digunakan:

@ Html.ActionLink ("MainPage", "Index", "Home")

MainPage: Nama teks Indeks: Tampilan Aksi Home: HomeController

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

Serdin çelik
sumber