HTML.ActionLink yöntemi


249

Diyelim ki bir dersim var

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

Öğe klasöründe ItemControllerbulunmayan bir sayfada , Loginyönteme bir bağlantı oluşturmak istiyorum . Peki hangi Html.ActionLinkyöntemi kullanmalıyım ve hangi parametreleri geçmeliyim?

Özellikle, yöntemin değiştirilmesini arıyorum

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

ASP.NET MVC enkarnasyonunda kullanımdan kaldırılmıştır.



@Danny Teşekkürler, buraya geldiğimde Google'da arıyordum.
Rei Miyasaka

Yanıtlar:


491

Bence istediğin bu:

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

Bu, aşağıdaki ActionLink imzası yöntemini kullanır:

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

ASP.NET MVC2

iki argüman değiştirildi

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

Bu, aşağıdaki ActionLink imzası yöntemini kullanır:

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

ASP.NET MVC3 +

bağımsız değişkenler MVC2 ile aynı sıradadır, ancak kimlik değeri artık gerekli değildir:

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

Bu, bağlantıya herhangi bir yönlendirme mantığının kodlanmasını önler.

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

Bu, varsayalım, aşağıdaki html çıktısını verecektir:

  1. article.Title = "Title"
  2. article.ArticleID = 5
  3. hala şu rotayı tanımladınız

. .

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

7
Ancak, bu / Item / Login? İd = 5 gibi bir URL vermiyor mu?
Adhip Gupta

21
Son parametreyi kaçırırsanız garip olan nedir, benim için ekliyor? Uzunluk = 8 geçerli eyleme
Chris S

32
@Chris S - Bunun eski bir yazı olduğunu biliyorum, ama? Length = 8'in sebebi sizden , nullSONRA bir parametreniz new { ... }olması gerektiğidir ... çünkü bu yöntemin aşırı yüklenmelerini kontrol ederseniz, parametrelerinizin htmlArguments olduğunu düşünürsünüz ... rota argümanları değil. Doğru yöntemi kullanmak için , u olan yöntemi kullanmanız gerekir routeArguments, htmlArguments.. bu yüzden sadece son olarak null değerini iletin htmlArgument. Bu yanıttaki ilk kod parçası var. Bunu kolayca görebilmeniz için bu yayını güncelledim (yani. Kaymıyor).
Pure.Krome

7
MVC 3 ile bunu deneyen var mı? Yukarıdaki örnekteki ControllerName ve ActionMethod satırlarının ters çevrilmiş olduğu anlaşılıyor. Bunu gören var mı?
Steve Duitsman

8
MVC3'te id özelliği bulunamadı ... bunun yerine aşağıdakiler kullanılmalıdır:@Html.ActionLink("Text","Action","Controller", new { item.ID }, null)
Gavin Coates

30

Joseph Kingry'nin cevabına eklemek istedim . Çözümü sağladı ama ilk başta da işe yaramadı ve Adhip Gupta gibi bir sonuç aldım. Sonra rotanın ilk etapta var olması ve parametrelerin rotayla tam olarak eşleşmesi gerektiğini fark ettim. Bu yüzden benim yolum için de dahil edilmesi gereken bir id ve sonra bir metin parametresi vardı.

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

4
Sadece ihtiyacım olan buydu - son boş argümanı eklemeyi unutmuştum . Teşekkürler.
Ian Oxley

1
Rota parametresi adından eşlemeyi de gösterdiğiniz için teşekkür ederiz (örneğin, yeni {id = ..., bar = ...}.
William Rose

17

RouteLink()Yönteme bakmak isteyebilirsiniz.Bu, sözlük aracılığıyla her şeyi (bağlantı metni ve rota adı hariç) belirtmenize izin verir.


4
Bunun sorunu nasıl çözdüğüne dair bir örnek görmek harika olurdu; MSDN sayfasında çok fazla yükleme var ve ne arayacağınızı bilmek kafa karıştırıcı olabilir
Simon Martin

14

Bence Joseph kontrolör ve eylemi tersine çevirdi. Önce eylem sonra kontrolör gelir. Bu biraz garip, ama imzanın görünüşü.

Sadece bir şeyleri açıklığa kavuşturmak için, bu çalışan sürümdür (Joseph örneğinin uyarlaması):

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

11

Peki buna ne dersin

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

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

Bu gerçekten cevap olarak işaretlenmiş olmalıydı, çünkü soruyu soran kişinin tam olarak ne aradığını ... ancak işaretli cevabın kullanıcı için çeşitli versiyonlarda rotaları doğru bir şekilde kurması için büyük bir ayrıntıya girdiğini not edeceğim. MVC.
Indy-Jones

9

Tüm fantezi pantolonlara gitmek istiyorsanız, bunu yapmak için onu nasıl uzatabilirsiniz:

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

Bunu System.Web.Mvcad alanına koymanız gerekecek :

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

Bu , tüm görünümleriniz için iki geçersiz kılma içerir Route Valuesve HTML Attributesayrıca tüm görünümlerinizin eklemesi gerekir: @using YourProject.Controllersveya bunuweb.config <pages><namespaces>


1
Bu yaklaşımı kullanmama daha çok şaşırdım. Bir denetleyiciyi / eylemi temsil etmek için görünümlerinizde dize değişmezlerini kullanmak gerçekten tehlikeli görünüyor.
Johnathon Sullinger

Tüm hayatım boyunca bunu arıyordum
Worthy7

Bunu denedim, işe yaramadı. Bana sonunda boş bir dize verdi - sanırım çünkü fonksiyonlarımda parametreler var.
Worthy7

Bu kodla bir github veya başka bir yer gönderebilir misiniz, böylece bir göz atabilir ve neden sizin için işe yaramadığını görebilir miyim?
Serj Sagan

2
Kelime fancypants güzel kullanımı. Bunu yeterince görmüyoruz.
gdbj

7

Okunabilirlik ve karışıklıkları önlemek için adlandırılmış parametreleri kullanın.

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

1

MVC5 ile böyle yaptım ve% 100 çalışma kodu ....

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

Siz bundan bir fikir edinebilirsiniz ...


0

Bu tip şunları kullanır:

@ Html.ActionLink ( "Ana Sayfa Künye", "Dizin", "Ev")

MainPage: Metnin adı Dizin: Eylem Görünümü Ana Sayfa: HomeController

Temel Kullanım 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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.