使用区域时,T4MVC会为ActionLink创建错误的URL

时间:2012-03-09 15:44:48

标签: asp.net-mvc-3 t4mvc

在我的项目中,我正在尝试在区域内的视图中创建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 source code并尝试复制相同的功能。我已将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 个答案:

答案 0 :(得分:1)

Darn,这看起来像2.6.69中的回归。您能否尝试2.6.68来验证它之前是否有效?我现在隐藏了2.6.69,所以其他人不会在新项目中自动获取它(以及更新时)。

这是导致错误修复的错误:http://mvccontrib.codeplex.com/workitem/7191

另外,您可以尝试该bug中最后一条评论中提到的确切修复吗?将方法更改为:

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

对于休息感到抱歉!