Search code examples
c#.netasp.net-mvchtml-helperactionlink

HTML.ActionLink method


Let's say I have a class

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

On a page that is not located at the Item folder, where ItemController resides, I want to create a link to the Login method. So which Html.ActionLink method I should use and what parameters should I pass?

Specifically, I am looking for the replacement of the method

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

that has been retired in the recent ASP.NET MVC incarnation.


Solution

  • I think what you want is this:

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

    This uses the following method ActionLink signature:

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

    ASP.NET MVC2

    two arguments have been switched around

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

    This uses the following method ActionLink signature:

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

    ASP.NET MVC3+

    arguments are in the same order as MVC2, however the id value is no longer required:

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

    This avoids hard-coding any routing logic into the link.

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

    This will give you the following html output, assuming:

    1. article.Title = "Title"
    2. article.ArticleID = 5
    3. you still have the following route defined

    . .

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