T4MVC与Url.Action()不兼容属性

时间:2011-06-05 01:59:28

标签: c# asp.net-mvc t4mvc

这是我的原始代码:

@Url.Action("LoginYoutube", "Account", new { returnUrl = Request.QueryString["ReturnUrl"] }, "http")

会产生:http://localhost:2543/Account/LoginYoutube

使用T4MVC我做:

Url.Action(MVC.Account.LoginYoutube().AddRouteValue("returnUrl", Request.QueryString["ReturnUrl"]))

并生成:/ Account / LoginYoutube

我需要带有“http”的最后一个参数才能获得http://localhost:2543。问题在于T4MVC我只能为Url.Action()调用放1个参数。

我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:7)

T4MVC确实在这里遗漏了一些东西,但它应该很容易添加。请尝试以下方法。在T4MVC.tt中,更改:

    public static string Action(this UrlHelper urlHelper, ActionResult result) {
        return urlHelper.RouteUrl(result.GetRouteValueDictionary());
    }

    public static string Action(this UrlHelper urlHelper, ActionResult result, string protocol = null, string hostName = null) {
        return urlHelper.RouteUrl(null, result.GetRouteValueDictionary(), protocol, hostName);
    }

这应该允许你写:

 @Url.Action(MVC.Account.LoginYoutube().AddRouteValue("returnUrl", Request.QueryString["ReturnUrl"]), "http")

请告诉我这是如何运作的,以便我们决定是否在官方模板中更改此内容。

答案 1 :(得分:4)

  

@David Ebbo:仅供参考我昨晚用这个改变(2.6.55)推出了新的版本。

这实际上打破了MVCContrib网格。或者至少使用与之前的T4MVC一起使用的代码,我得到了一个编译错误:

  

CS0854:表达式树可能不包含使用可选参数的调用或调用

生成网格的代码:

Html.Grid(Model.Customers)
          .Columns(c =>
            {
                c.For(x => Html.ActionLink(x.Name, MVC.Partner.Edit(x.ID), new { @class = "ILPartnerEdit" }))
                    .Named(LanguageResources.Name);
...

但是通过将此添加到.TT(< 3开源)来解决:

        public static <#=HtmlStringType #> ActionLink(this HtmlHelper htmlHelper, string linkText, ActionResult result, object htmlAttributes)
        {
            return ActionLink(htmlHelper, linkText, result, new RouteValueDictionary(htmlAttributes));
        }