Recientemente he descubierto Las áreas en ASP.NET MVC 4, que me han implementado con éxito, pero estoy ejecutando en problemas con la @Html.ActionLink ayudante en mi maquinilla de Afeitar vistas. El URL de este helper genera siempre parece ser relativa a la dirección URL de la página actual.

Tengo mi sitio web configurado en IIS 7 (Win7) como una Aplicación del directorio virtual en /Foo.

Tengo dos Áreas registrado: Admin y Blogs. Tengo el defecto de código en el AdminAreaRegistration.cs y BlogsAreaRegistration.cs archivos. He añadido namespaces = new[] { "MvcProject.Controllers" } a los valores predeterminados de la predeterminada RouteConfig:

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, correctamente la carga de la página «inicio» de mi sitio. En este punto, todos los enlaces de acción tienen sus direcciones Url correctas.

Código de ejemplo 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>

Este correctamente el renderizado de 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 «Blogs» por ejemplo, este URL correctamente, se carga en el navegador: /Foo/Blogs/Home.

Ahora los enlaces en mi barra de navegación principal que cambiar su 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>

Aviso de que «Blogs/» se anexa el directorio virtual de IIS nombre, por lo que /Foo/Blogs/Home es ahora /Foo/Blogs/Blogs/Home.

Los controladores y las vistas son de representación bien, es sólo las llamadas a @Html.ActionLink en mi MvcProject/Views/Shared/_Layout.cshtml vista no están funcionando como se esperaba.

Se siente como que me estoy perdiendo algo trivial, pero ninguna cantidad de la búsqueda ha llegado con una respuesta. Cada entrada del blog y el tutorial que he encontrado para la implementación de las Áreas en ASP.NET MVC4 no hace mención de los cambios en la forma en @Html.ActionLink se comporta.

4 Comentarios

  1. 73

    Odio a responder a mi propia pregunta, pero @Matt Corporal me puso en el camino correcto.

    La @Html.Action método realmente invoca un controlador y representa la vista, lo que no iba a trabajar para crear un fragmento de código HTML en mi caso, como esto provocaba una función recursiva llamada resultando en un StackOverflowException. El @Url.Action(action, controller, { area = "abc" }) en efecto, retorno de la URL, pero finalmente descubrí una sobrecarga de Html.ActionLink que proporciona 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 derecha.

    Documentación: @Html.ActionLink (LinkExtensions.ActionLink)

    De la documentación para este particular sobrecarga:

    LinkExtensions.ActionLink(Controlador, De Acción, De Texto, RouteArgs, HtmlAttributes)

    Ha sido difícil encontrar la documentación de estos ayudantes. Tiendo a buscar «Html.ActionLink» cuando yo probablemente debería haber buscado «LinkExtensions.ActionLink», si eso ayuda a alguien en el futuro.

    Todavía marcado Matt en la respuesta de la respuesta.

    Edición: Encontrar otro HTML helper para resolver este:

    @Html.RouteLink("Admin", new { action = "Index", controller = "Home", area = "Admin" })
    • Sólo para tu INFORMACIÓN, respondiendo a su propia pregunta, todavía es una gran cosa! Permite a la gente como que me muestran y encontrar la respuesta a un problema o pregunta que pudiera haber tenido. Gracias!
    • Esta respuesta me ayudó con mi problema. Yo estaba en un error que dice The controller for path '/' was not found or does not implement IController. fue porque me eliminan mi HomeController.cs archivo y no entendía lo que dependía de él.
    • La solución resultó ser más útil. Yo estaba tratando sin incluir a «null».
    • Visual Studio 2017 es bueno, porque indica de manera más explícita que un método es un método de extensión. Las versiones anteriores de VS no eran muy útiles en ese sentido. Yo aún lucha con mi Google-fu cuando se trata de maquinilla de Afeitar de la plantilla de los métodos de extensión.
  2. 16

    Cómo puedo redirigir a una zona de añadir un parámetro

    @Html.Action("Action", "Controller", new { area = "AreaName" })

    para el href parte de un enlace, yo uso

    @Url.Action("Action", "Controller", new { area = "AreaName" })
    • Así, curiosa coincidencia. Tan pronto como me añadió que a mi punto de vista, tengo un StackOverflowException 🙂 No sé por qué… Momento para profundizar en los registros de sucesos de Windows.
    • Después de hacer un poco de lectura, parece como si @Html.Action(...) realmente invoca y hace a la acción. En mi caso, yo solo estoy tratando de escupir una dirección URL. Creo que me estoy poniendo un desbordamiento de pila, porque el principal archivo de diseño hace de los Blogs el Hogar/acción, que se detiene en el archivo de diseño, que hace que los Blogs/Home acción, que se detiene en el principal archivo de diseño, que … y así seguimos hasta el infinito.
    • para el href parte de un vínculo o de una dirección url que voy a usar en jquery yo uso de la dirección url.la acción en su lugar. ver mi cambio de más arriba
  3. 2

    Sólo para agregar mi bits:

    Recuerda, vas a necesitar tener al menos 2 áreas en su aplicación MVC para obtener el routeValues: { area="" } de trabajo; de lo contrario, el valor del área que será utilizada como una consulta de parámetro de cadena y enlace tendrá este aspecto: /?area=

    Si usted no tiene al menos 2 áreas, se puede corregir este comportamiento por:

    1. edición de la ruta por defecto en RouteConfig.cs como este:

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

    O

    2. La adición de un maniquí de área de su proyecto de MVC.

    • En mi caso empezamos con el original proyecto de MVC estructura y, a continuación, más tarde añadió un área. Tuve que hacer el cambio para que el logotipo de la dirección url a la página de inicio predeterminada de trabajo a través de todos los controladores.
  4. 0

    A continuación son algunas de la manera por la cual usted puede crear un botón de enlace en MVC.

    @Html.ActionLink("Admin", "Index", "Home", new { area = "Admin" }, null)  
    @Html.RouteLink("Admin", new { action = "Index", controller = "Home", area = "Admin" })  
    @Html.Action("Action", "Controller", new { area = "AreaName" })  
    @Url.Action("Action", "Controller", new { area = "AreaName" })  
    <a class="ui-btn" data-val="abc" href="/Home/Edit/ANTON">Edit</a>  
    <a data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#CustomerList" href="/Home/Germany">Customer from Germany</a>  
    <a data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#CustomerList" href="/Home/Mexico">Customer from Mexico</a> 

    Espero que esto le ayudará.

    • Sólo ten cuidado con Html.Action(...). Como me enteré de que no se crea un vínculo. Hace un controlador. De lo contrario, un buen resumen de los métodos. Gracias.

Dejar respuesta

Please enter your comment!
Please enter your name here