T4MVC Не работает свойство с Url.Action()

Это был мой исходный код:

@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 я могу указать только 1 параметр для вызова Url.Action().

Как я могу заставить это работать?


person Ryan    schedule 05.06.2011    source источник


Ответы (2)


В T4MVC действительно чего-то не хватает, но это легко добавить. Пожалуйста, попробуйте следующее. В T4MVC.tt измените:

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

Это должно позволить вам написать:

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

Пожалуйста, дайте мне знать, как это работает, чтобы мы могли решить, следует ли изменить это в официальном шаблоне.

person David Ebbo    schedule 05.06.2011
comment
Ага отлично сработало! Также может быть полезно добавить перегрузку для того, чтобы делать это по старинке: Url.Action(MVC.Account.LoginYoutube(), new { Request.QueryString[ReturnUrl]}, http) - person Ryan; 05.06.2011
comment
К вашему сведению, вчера вечером я выпустил новую сборку с этим изменением (2.6.55). - person David Ebbo; 07.06.2011

@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));
        }
person Akos Lukacs    schedule 15.06.2011
comment
Я думаю, что это больше связано с другой (похожей) проблемой: stackoverflow.com/questions/6280347/ - person David Ebbo; 16.06.2011
comment
Но я не уверен, что понимаю, почему это ломается, так как я добавил только необязательные параметры. Вы можете объяснить? Спасибо! - person David Ebbo; 16.06.2011
comment
Это функция С#4. У вас не может быть методов с необязательными параметрами в выражениях. lostechies.com/jimmybogard/2010 /05/18/ Я получаю исключение компиляции при компиляции представления aspx, которое содержит сетку, состоящую из выражений. (я думаю, это было бы то же самое для бритвы). - person Akos Lukacs; 21.06.2011
comment
Понятно! Я только что ввел это изменение в T4MVC 2.6.57. Пожалуйста, подтвердите, что новый официальный шаблон вам подходит. Спасибо! - person David Ebbo; 21.06.2011