4
votes

This was my original code:

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

Which would generate: http://localhost:2543/Account/LoginYoutube

With T4MVC I do:

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

and that generates: /Account/LoginYoutube

I need the last parameter with "http" in order to get the http://localhost:2543. The problem is with T4MVC I can only put 1 parameter for the call to Url.Action().

How can I get this to work?

2

2 Answers

7
votes

T4MVC is indeed missing something here, but it should be easy to add. Please try the following. In T4MVC.tt, change:

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

to

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

This should allow you to write:

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

Please let me know how that works, so we can decide whether to change this in the official template.

4
votes

@David Ebbo: FYI I pushed a new build last night with this change (2.6.55).

That actually breaks MVCContrib grid. Or at least with the code that worked with the previous T4MVC now I got a compilation error:

CS0854: An expression tree may not contain a call or invocation that uses optional arguments

The code for generating the grid:

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

But solved by adding this to the .TT (<3 open source):

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