¿Cómo especificar un nombre de área en un enlace de acción?

156

Tengo una página maestra compartida que estoy usando desde 2 áreas diferentes en mi aplicación mvc 2. La página maestra tiene un enlace de acción que actualmente especifica el controlador y la acción, pero, por supuesto, el enlace no funciona si estoy en el área incorrecta. No veo una sobrecarga para actionlink que tome un parámetro de área, ¿es posible hacerlo?

Jeremy
fuente

Respuestas:

245

Lo averigué..

Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" }, new{})
Jeremy
fuente
3
@ Pure.Krome: sí. ¡Nada intuitivo al respecto!
Jeremy
3
Asegúrese de que no haya espacios en blanco antes o después del Areaname. De lo contrario, simplemente lo ignorará ... y luego te hará preguntarte cuatro horas qué está mal ... como yo.
Piotr Kula
¿Cómo se agregan parámetros allí?
Yorro
¿Cómo se ve esto traducido al enlace? Quiero decir, cuando el formulario se representa y se devuelve al cliente.
FrenkyB
79

Algo con lo que me encontré justo después de esto, que imagino que otros podrían encontrar: si necesita vincular desde un área a una acción que no esté en un área, aún necesita especificar el Área como una cadena vacía.

Por ejemplo, moví un código MVC a un área y descubrí que necesitaba actualizar las URL en la página maestra que hacía referencia a otras páginas del sitio.

Para especificar una URL para algo que no está en un área, use

Html.ActionLink("home", "Index", new { area = "", controller = "Home" })
Frank Schwieterman
fuente
44
Este es un muy buen consejo! Pero da resultados no esperados con MVC 2 .. Pequeña corrección - Html.ActionLink ("home", "Index", new {area = "", controller = "Home"})
Alexander Beletsky
15

Utilizar:

 Html.ActionLink("Text", "ActionName", "ControllerName", new { Area = "AreaName" }, null)

Nota : el cuarto parámetro es pasar la ruta Values, si pasa un parámetro vacío, considerará la estructura raíz y si pasa el valor apropiado, úselo como área.

Además, no olvide usar nullo new{}como el quinto parámetro porque pasar nullo new {}al crear un enlace de acción no sobrecargará el método (text,action,controller,route data)o (text,action,controller,route data,html attribute)usará el método adecuado

Subhash Rao
fuente
11

En MVC2 dar area="root"funcionó para mí como a continuación

Html.ActionLink("Home", "Index", "Home", new { Area = "root" }, new{})
Sreejith
fuente
6

Un buen truco que puede hacer si está usando mucho un área en una Vista es definirlo como una variable en la parte superior:

@{ var awesomeArea = new { area = "Awesome" }; }

@Html.Action("Something", "Somewhere", awesomeArea)
@Html.ActionLink("Stuff", "FooBar", awesomeArea)
dav_i
fuente
4

Esto es lo que se me ocurrió como una solución para permitir que un usuario se vincule a los sistemas de autenticación preconstruidos.

Cada una de mis áreas tiene una versión del archivo _LoginPartial.cshtml.

Probablemente podría hacer que la aplicación use una única versión del archivo, sin embargo, seguí encontrando errores al intentar usar un solo inicio de sesión parcial.

Es solo una ligera modificación al inicio de sesión original generado, pero parece funcionar bien cuando se usa en áreas específicas.

Aquí está el código que se usa en todos ellos:

@if (Request.IsAuthenticated)
{
    <text>
    Hello, @Html.ActionLink(User.Identity.Name, "Manage", "Account", new { area = "" }, htmlAttributes: new { @class = "username", title = "Manage" })!
    @using (Html.BeginForm("LogOff", "Account", new { area = "" }, FormMethod.Post, new { id = "logoutForm" }))
 {
        @Html.AntiForgeryToken()
        <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
 }
    </text>
}
else
{
    <ul>
        <li>@Html.ActionLink("Register", "Register", "Account", new { area = "" }, htmlAttributes: new { id = "registerLink" })</li>
        <li>@Html.ActionLink("Log in", "Login", "Account", new { area = "" }, htmlAttributes: new { id = "loginLink" })</li>
    </ul>
}
Anthony Hart
fuente
Establecer explícitamente htmlAttributes:funcionó muy bien para usar múltiples parámetros.
Travis J
2

Si no puede usar el enlace de aplicación web estándar como Acerca de, Inicio, Contac, etc. del área. Cambias lineas

@Html.ActionLink("Ana Sayfa", "Index", "Home", new { area = "" }, new {})

de

Views \ Shared_Layout.cshtml

ErdincDonmez
fuente
1

En mi aplicación ASP Net Core, simplemente agrego el área a los atributos html de esta manera:

@Html.ActionLink("Link Text", "ActionName", "ControllerName", new { Area = "AreaName" , id = @Model.ID, name = @Model.name })
Moleius
fuente
0

Utilizando

@Html.ActionLink("DisplayText", "ActionName", "ControllerName", new { area = "AreaName"}, null)

Logrará lo que busca.

¡DisplayText es lo que se mostrará (lo mismo que <a href="#">DisplayText</a>), ActionName es el método que se llama en el controlador y ControllerName es obviamente el controlador al que desea llamar! El siguiente parámetro es 'Valor de ruta' donde agregaría su área. Si actualmente se encuentra en un Área y desea volver a su raíz, Home/Indexpor ejemplo, dejaría el valor como una cadena vacía, por ejemplo new { area = ""}. El valor final es 'Atributos HTML' y dónde agregaría una clase si lo desea y debería ser un nullsi no tiene ningún atributo para agregar. Pero como el último parámetro se ve como 'Atributos HTML'; para que los valores de ruta sean reconocidos, esto debería sernull

Rob P
fuente