c# - net - imagen en actionlink
Cómo utilizar correctamente Html.ActionLink con ASP.NET MVC 4 áreas (3)
Recientemente descubrí Areas en ASP.NET MVC 4 , que he implementado con éxito, pero estoy teniendo problemas con el ayudante @Html.ActionLink
en mis vistas de Razor. La URL que este ayudante genera siempre parece ser relativa a la URL de la página actual.
Tengo mi sitio web configurado en IIS 7 (Win7) como un directorio virtual de aplicaciones en /Foo
.
Tengo dos áreas registradas: Admin y Blogs. Tengo el código predeterminado en los archivos AdminAreaRegistration.cs
y BlogsAreaRegistration.cs
. namespaces = new[] { "MvcProject.Controllers" }
a los valores predeterminados de RouteConfig por defecto:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home", action = "Index", id = UrlParameter.Optional,
namespaces = new[] { "MvcProject.Controllers" }
}
);
}
}
Cuando voy a la página de inicio de mi sitio: http://localhost/Foo
, carga correctamente la página "inicio" de mi sitio. En este punto, todos los enlaces de acción tienen sus URL correctas.
Código de muestra de MvcProject/Views/Shared/_Layout.cshtml
<h2>Main Navigation</h2>
<ul>
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("Blogs", "Index", "Blogs/Home")</li>
<li>@Html.ActionLink("Admin", "Index", "Admin/Home")</li>
</ul>
Esto está representando correctamente el HTML como:
<h2>Main Navigation</h2>
<ul>
<li><a href="/Foo">Home</a></li>
<li><a href="/Foo/Blogs/Home"></li>
<li><a href="/Foo/Admin/Home"></li>
</ul>
Cuando navego en el navegador a "Blogs", por ejemplo, esta URL se carga correctamente en el navegador: /Foo/Blogs/Home
.
Ahora los enlaces en mi navegación principal cambian sus URL a:
<h2>Main Navigation</h2>
<ul>
<li><a href="/Foo/Blogs/Home">Home</a></li>
<li><a href="/Foo/Blogs/Blogs/Home"></li>
<li><a href="/Foo/Blogs/Admin/Home"></li>
</ul>
Observe que "Blogs /" se agrega al nombre del directorio virtual de IIS, de modo que /Foo/Blogs/Home
ahora /Foo/Blogs/Blogs/Home
.
Los controladores y las vistas funcionan bien, solo las llamadas a @Html.ActionLink
en mi vista MvcProject/Views/Shared/_Layout.cshtml
no funcionan como esperaba.
Se siente como si me estuviera perdiendo algo trivial, pero ninguna búsqueda ha dado una respuesta. Cada publicación de blog y tutorial que he encontrado para implementar Áreas en ASP.NET MVC4 no menciona los cambios en el comportamiento de @Html.ActionLink
.
Cómo redirecciono a un área es agregarlo como parámetro
@Html.Action("Action", "Controller", new { area = "AreaName" })
para la parte href de un enlace que uso
@Url.Action("Action", "Controller", new { area = "AreaName" })
Odio responder mi propia pregunta, pero @Matt Bodily me puso en el camino correcto.
El método @Html.Action
realmente invoca un controlador y representa la vista, por lo que no funcionaría crear un fragmento de HTML en mi caso, ya que esto causaba una llamada de función recursiva que daba como resultado una Exception. El @Url.Action(action, controller, { area = "abc" })
realmente devuelve la URL, pero finalmente descubrí una sobrecarga de Html.ActionLink
que proporcionó una mejor solución para mi caso:
@Html.ActionLink("Admin", "Index", "Home", new { area = "Admin" }, null)
Nota: , null
es significativo en este caso, para que coincida con la firma correcta.
Documentación: @ Html.ActionLink (LinkExtensions.ActionLink)
Documentación para esta sobrecarga particular:
LinkExtensions.ActionLink (Controlador, Acción, Texto, RouteArgs, HtmlAttributes)
Ha sido difícil encontrar documentación para estos ayudantes. Tiendo a buscar "Html.ActionLink" cuando probablemente debería haber buscado "LinkExtensions.ActionLink", si eso ayuda a alguien en el futuro.
Aún marcando la respuesta de Matt como la respuesta.
Editar: Encontré otro ayudante de HTML para resolver esto:
@Html.RouteLink("Admin", new { action = "Index", controller = "Home", area = "Admin" })
Solo para sumar mi parte:
Recuerde, necesitará tener al menos 2 áreas en su aplicación MVC para obtener los routeValues: { area="" }
funcionando; de lo contrario, el valor del área se usará como un parámetro de cadena de consulta y su enlace se verá así: /?area=
Si no tiene al menos 2 áreas, puede corregir este comportamiento de la siguiente manera:
1. editar la ruta predeterminada en RouteConfig.cs
esta manera:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
O
2. Agregar un área ficticia a su proyecto MVC.