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

@Danny Thanks, 내가 여기에 도착했을 때 Google에서 찾고있었습니다.
Rei Miyasaka

답변:


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와 동일한 순서이지만 id 값은 더 이상 필요하지 않습니다.

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
그러나 이것이 / Item / Login? id = 5 같은 URL을 제공하지 않습니까?
Adhip Gupta

21
이상한 점은 마지막 매개 변수를 놓치면 현재 조치에? Length = 8을 추가하는 것입니다.
Chris S

32
@Chris S-나는 이것이 오래된 게시물이라는 것을 알고 있지만? Length = 8의 이유는 당신이 , null후에 매개 변수 를 가져야 new { ... }하기 때문입니다. ... 인수를 라우팅하지 않습니다. 올바른 방법 을 사용하려면 u가있는 방법을 사용해야합니다 routeArguments, htmlArguments. 그래서 마지막에 null을 전달하십시오 htmlArgument. 이 답장의 첫 번째 코드가 있습니다. 이 게시물을 업데이트하여 쉽게 볼 수 있습니다 (예 : 스크롤되지 않음).
Pure.Krome

7
누구든지 MVC 3으로 이것을 시도 했습니까? 위의 샘플에서 ControllerName 및 ActionMethod 줄이 뒤집힌 것 같습니다. 다른 사람이 본 적이 있습니까?
Steve Duitsman

8
MVC3에서 id 속성을 찾을 수 없습니다 ... 대신 다음을 사용해야합니다.@Html.ActionLink("Text","Action","Controller", new { item.ID }, null)
Gavin Coates

30

조셉 킹 리의 대답에 덧붙이고 싶었습니다 . 그는 해결책을 제공했지만 처음에는 해결책을 얻지 못했고 Adhip Gupta와 같은 결과를 얻었습니다. 그런 다음 경로가 먼저 존재해야하며 매개 변수가 경로와 정확하게 일치해야한다는 것을 깨달았습니다. 그래서 나는 내 경로에 대한 ID와 텍스트 매개 변수를 가지고 있었고 포함해야했습니다.

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

4
이것은 내가 필요한 것입니다-마지막 null 인수 를 추가하는 것을 잊었습니다 . 감사.
Ian Oxley

1
route 매개 변수 이름의 매핑도 표시해 주셔서 감사합니다 (예 : 새로운 {id = ..., bar = ...}.
William Rose

17

이 방법을 RouteLink()사용하면 사전을 통해 모든 것을 지정할 수 있습니다 (링크 텍스트 및 경로 이름 제외).


4
이것이 문제를 해결하는 방법의 예를 보는 것이 좋을 것입니다. MSDN 페이지에는 많은 과부하가 있으며 무엇을 찾아야할지 혼동 될 수 있습니다.
Simon Martin

14

나는 조셉이 컨트롤러와 행동을 뒤집 었다고 생각합니다. 먼저 동작 다음에 컨트롤러가옵니다. 이것은 다소 이상하지만 서명이 보이는 방식입니다.

명확히하기 위해, 이것은 작동하는 버전입니다 (Joseph의 예의 적응) :

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의.
Indy-Jones

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 ValuesHTML Attributes에 대한 두 가지 재정의가 포함되며 , 모든보기에 추가해야 @using YourProject.Controllers합니다.web.config <pages><namespaces>


1
이 방법을 사용하지 않는 것이 더 놀랍습니다. 컨트롤러 / 액션을 나타 내기 위해 뷰에서 문자열 리터럴을 사용하는 것은 정말 위험한 것 같습니다.
Johnathon Sullinger

내 평생을 찾고 있었어요
Worthy7

이것을 시도했지만 작동하지 않았습니다. 끝에 빈 문자열이 생겼습니다. 함수에 매개 변수가 있기 때문에 가정합니다.
Worthy7

이 코드로 github 또는 다른 장소를 게시 할 수 있습니까? 그래서 왜 그것이 작동하지 않는지 볼 수 있습니까?
Serj Sagan

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 : 텍스트 이름 Index : Action View Home : HomeController

기본 사용 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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.