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 -ダニーPflughoeft

@Dannyありがとう、私がここにたどり着いたとき、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

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

これは、次のメソッド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 { ... }...そのメソッドのオーバーロードをチェックすると、パラメーターはhtmlArgumentsであると考えられます...引数をルーティングしません。正しいメソッドを使用するには、uがrouteArguments, htmlArguments.. を持っているメソッドを使用する必要があるので、最後にnullを渡しますhtmlArgument。この返信の最初のコードにはそれが含まれています。私はこの投稿を更新しましたので、簡単に確認できます(つまり、スクロールしません)。
Pure.Krome、2010

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
ルートのパラメータ名からマッピングを示すためのおかげで、あまりにも(例えば新しい{ID = ...、バー= ...}。
ウィリアム・ローズ

17

あなたは見たいかもしれませんRouteLink()method.That 1あなたは辞書を経由して(リンクテキストとルート名を除く)のすべてを指定することができます。


4
それが問題をどのように解決するかの例を見るのは素晴らしいでしょう。MSDNページには多くのオーバーロードがあり、何を探すべきかを知るのは混乱する可能性があります
Simon Martin

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およびの2つのオーバーライドが含まれますHTML Attributes。また、すべてのビューを追加する必要があります。@using YourProject.Controllersまたは、web.config <pages><namespaces>


1
このアプローチを使わないことにもっと驚いています。コントローラー/アクションを表すためにビューの至る所で文字列リテラルを使用するのは本当に危険に思われます。
Johnathon Sullinger、2014


これを試してみましたが、うまくいきませんでした。最後に空の文字列をくれた-関数にパラメータがあるからだと思う。
価値がある7

このコードをGitHubまたは他の場所に投稿して、なぜそれが機能しないのかを調べて確認できますか?
Serj Sagan 2016

2
ファンシーパンツという言葉の素敵な使用法。それは十分とは言えません。
gdbj 2017年

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

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.