T4MVC создает неверный URL для ActionLink при использовании областей - PullRequest
1 голос
/ 09 марта 2012

В моем проекте я пытаюсь создать URL в представлении внутри области.
Код такой:

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

Когда я просматриваю результат в браузере, сгенерированный кодвыглядит следующим образом:

<a class="btn" href="/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>

Я искал код в T4MVC и обнаружил, что это был метод генерации кода выше (внутри класса T4Extensions):

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);
}

По-видимому, метод RouteLink не может использовать result.GetRouteValueDictionary(), как следует.

Итак, я проверил исходный код ASP.NET MVC и попытался повторить то же самоефункциональность.Я изменил свой T4MVC на это:

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));
}

Теперь он работает (что, конечно, здорово), по крайней мере, для тестов, которые я сделал, но я боюсь, что я делаюВо-первых, что-то не так, и этот путь может привести меня к некоторым проблемам.

1 Ответ

1 голос
/ 09 марта 2012

Черт, это похоже на регрессию в 2.6.69. Можете ли вы попробовать 2.6.68, чтобы убедиться, что он действительно работал раньше? Я пока скрыл 2.6.69, чтобы другие не получали его автоматически в новых проектах (и при обновлении).

Это ошибка, которая вызвала плохое исправление: http://mvccontrib.codeplex.com/workitem/7191

Кроме того, не могли бы вы попробовать точное исправление, упомянутое в последнем комментарии к этой ошибке? Измените метод на:

    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));
    }

Извините за перерыв!

...