T4MVC crea una URL incorrecta para ActionLink al usar áreas

En mi proyecto, intento crear una URL en una vista dentro de un área.
El código es este:

@Html.ActionLink("Cancel", MVC.MyArea.MyController.Index(), new { @class = "btn" })

Cuando veo el resultado en el navegador, el código generado es el siguiente:

<a class="btn" href="/es/MyArea/MyController/MyCurrentAction?Count=3&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&amp;Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D">Cancel</a>

Fui a buscar el código en T4MVC y descubrí que este era el método que generaba el código anterior (dentro del T4Extensions clase):

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, ActionResult result, object htmlAttributes, string protocol = null, string hostName = null, string fragment = null) {
    return htmlHelper.RouteLink(linkText, null, protocol, hostName, fragment, result.GetRouteValueDictionary(), htmlAttributes);
}

Al parecer, el RouteLink método es no ser capaz de utilizar el result.GetRouteValueDictionary() como debería.

Entonces, revisé el Código fuente de ASP.NET MVC y trató de replicar la misma funcionalidad. He cambiado mi T4MVC a esto:

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, ActionResult result, object htmlAttributes, string protocol = null, string hostName = null, string fragment = null) {
    var t4mvcResult = result.GetT4MVCResult();
    var actionName = t4mvcResult.Action;
    var controllerName = t4mvcResult.Controller;
    var routeValues = new RouteValueDictionary(t4mvcResult.RouteValueDictionary);
    var htmlAttribs = new RouteValueDictionary(htmlAttributes);
    return new MvcHtmlString(HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, linkText, null /* routeName */, actionName, controllerName, protocol, hostName, fragment, routeValues, htmlAttribs));
}

Ahora está funcionando (lo cual es genial, por supuesto), al menos para las pruebas que he hecho, pero me temo que estoy haciendo algo mal en primer lugar y que este camino puede llevarme a tener algunos problemas en el futuro.

preguntado el 09 de marzo de 12 a las 15:03

1 Respuestas

Maldita sea, esto parece una regresión en 2.6.69. ¿Puedes probar 2.6.68 para verificar que efectivamente funcionó antes? He ocultado 2.6.69 por ahora para que otros no lo obtengan automáticamente en nuevos proyectos (y al actualizar).

Este fue el error que desencadenó la mala solución: http://mvccontrib.codeplex.com/workitem/7191

Además, ¿podría probar la solución exacta mencionada en el último comentario de ese error? Cambia el método a:

    public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, ActionResult result, object htmlAttributes, string protocol = null, string hostName = null, string fragment = null)
    {
        return htmlHelper.RouteLink(linkText, null, protocol, hostName, fragment, result.GetRouteValueDictionary(), HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }

¡Perdón por el descanso!

respondido 09 mar '12, 18:03

¡Cambié el método como lo has señalado y se solucionó! Por cierto, has hecho un gran trabajo con T4MVC. ¡Gracias! - nelson reyes

¡Gracias! Ok, la solución ahora está en la nueva compilación 2.7.0 (en NuGet), por lo que debería poder actualizar. - david ebo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.