Search code examples
asp.net-mvc-3routesactionlinkhtml.actionlink

ActionLink can't access root folder - MVC 3


I have an .Net MVC 3 web application that has the following structure

  • root
    • Views
      • Account
        • LoginPage.aspx
    • Controllers
      • AccountController
    • Areas
      • Course
        • Index.aspx

Imagine I am currently at the Index.aspx page in the Course area, and I would have a button that would forward me to the LoginPage.aspx

In a ASP.Net MVC I would call http://localhost/Account/Login that it would lead me to the correct page. If I just write it down on the browser it works!

But I would like to use the HTML Helper ActionLink, so I tried:

<%: Html.ActionLink("Log on", "Login",  "Account", routeValues: null, htmlAttributes: new {  id = "logonLink", data_dialog_title = "Logon" })%>

It get the relative path: http://localhost/Course/Account/Login

I tried also:

<%: Html.ActionLink("Log on", "Login",  "../Account", routeValues: null, htmlAttributes: new {  id = "loginLink", data_dialog_title = "Login" })%>

I got the error message: Cannot use a leading .. to exit above the top directory.

I also tried the relative path:

<%: Html.ActionLink("Log on", "Login",  "~/Account", routeValues: null, htmlAttributes: new {  id = "loginLink", data_dialog_title = "Login" })%>

And it lead me to:

http://localhost/Course/~/Account/Login

I would really appreciate how to find a solution for this problem.


Solution

  • Try this:

    <%: Html.ActionLink("Log on", "Login",  "Account", new { area = "" } , new {  id = "logonLink", data_dialog_title = "Logon" })%>
    

    The key is the area = "" bit. When using Url.Action or Html.ActionLink with areas, if you don't specify the area route value, MVC will only look for a match in the current area.

    It get's even more important when using partial views/templates, since they can be rendered in Views in different areas.

    So if using areas, get into the habit of always specifying the area route value, unless using Url.RouteUrl or Html.RouteLink.