web-dev-qa-db-ja.com

HTML.ActionLinkメソッド

私はクラスがあるとしましょう

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

ItemControllerが存在するItemフォルダにないページでは、Loginメソッドへのリンクを作成したいです。それで、私はどのHtml.ActionLinkメソッドを使うべきで、どんなパラメータを渡すべきですか?

具体的には、私はメソッドの置き換えを探しています

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

それは最近のASP.NET MVCの形では廃止されました。

237
Graviton

私はあなたが欲しいものはこれだと思います:

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
);
468
Joseph Kingry

私は Joseph Kingryの答え に追加したいと思いました。彼は解決策を提供しましたが、最初はそれをうまく機能させることができず、Adhip Guptaのような結果を得ました。それから私はルートがそもそも存在していなければならず、パラメータはルートと正確に一致する必要があることに気づきました。それで私は自分のルートのためのidそしてそれからtextパラメータも持っていましたが、それもまた含める必要がありました。

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

RouteLink() メソッドを見てみた方がよいかもしれません。辞書を使って(リンクテキストとルート名を除く)すべてを指定することができます。

17
Haacked

私はジョセフがコントローラーと行動をひっくり返したと思います。最初にアクション、次にコントローラが来ます。これはやや奇妙ですが、署名の見え方です。

物事を明確にするために、これは動作するバージョンです(ジョセフの例の適応)。

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

これはどうですか

<%=Html.ActionLink("Get Involved", 
                   "Show", 
                   "Home", 
                   new 
                       { 
                           id = "GetInvolved" 
                       }, 
                   new { 
                           @class = "menuitem", 
                           id = "menu_getinvolved" 
                       }
                   )%>
11
Hasan
Html.ActionLink(article.Title, "Login/" + article.ArticleID, 'Item") 
10
Adhip Gupta

すべての派手なパンツに行きたい場合は、これを拡張してこれを行うことができます:

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

9
Serj Sagan

読みやすくするため、および混乱を避けるために名前付きパラメーターを使用してください。

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

MVC5で私はこのようにそれをしました、そしてそれは100%作業コードです....

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

皆さん、これからアイデアを得ることができます...

1
Sohail Malik