Pergunta

Eu estou tentando mudar nossos links sobre a T4MVC , e eu' m tendo um pequeno problema com parâmetros que não fazem parte da assinatura de uma ação. Temos uma rota que vai algo como isto:

http://www.mydomain.com/ {fooKey} / {barkey} / {BarID}

==> leva a BarController.Details (BarID) .

fooKey e barkey só são adicionadas às ligações para fins de SEO. (Desde bar é uma entidade filho de foo, e nós queremos representar essa hierarquia na URL)

Até agora, nós usaríamos

<% =Html.ActionLink(bar.Name, "Details", "Bar", new {barID = bar.ID, fooKey = bar.Foo.Key, barKey = bar.Key}, null)%>

E isso nos levaria a BarController.Details (BarID), mantendo fooKey e barkey na URL.

Agora que nós começamos com T4MVC, tentamos mudá-lo para

<% =Html.ActionLink(bar.Name, MVC.Bar.Details(bar.ID), null)%>

Desde barkey e fooKey não são parte da assinatura ação detalhes, eles não são mais visíveis na URL.

Existe uma maneira de contornar isso sem ter que adicionar esses parâmetros para a assinatura ação?

Foi útil?

Solução

coisa semelhante também surgiu no Fórum T4MVC ( este segmento). Eu acho que eu vou em frente e adicionar suporte para ele em T4MVC.

Na verdade, eu só pensava em uma maneira interessante para resolver isso. O problema com a adição de uma sobrecarga para passar argumentos extras é que você precisa adicionar sobrecargas semelhantes a todos os outros métodos de extensão T4MVC que levam um ActionResult, que pode ficar confuso.

Em vez disso, podemos usar uma abordagem fluente para fazer esta disponível em todos os lugares com pouco esforço. A idéia é que você vai escrever:

<%= Html.ActionLink(
    bar.Name,
    MVC.Bar.Details(bar.ID)
        .AddRouteValues(new {fooKey = bar.Foo.Key, barKey = bar.Key}))%>

Ou se você só precisava para adicionar um valor:

<%= Html.ActionLink(
    bar.Name,
    MVC.Bar.Details(bar.ID)
        .AddRouteValue("fooKey", bar.Foo.Key))%>

Aqui está como AddRouteValues ??é implementado:

public static ActionResult AddRouteValues(this ActionResult result, object routeValues) {
    return result.AddRouteValues(new RouteValueDictionary(routeValues));
}

public static ActionResult AddRouteValues(this ActionResult result, RouteValueDictionary routeValues) {
    RouteValueDictionary currentRouteValues = result.GetRouteValueDictionary();

    // Add all the extra values
    foreach (var pair in routeValues) {
        currentRouteValues.Add(pair.Key, pair.Value);
    }

    return result;
}

public static ActionResult AddRouteValue(this ActionResult result, string name, object value) {
    RouteValueDictionary routeValues = result.GetRouteValueDictionary();
    routeValues.Add(name, value);
    return result;
}

Seria ótimo se você pudesse dar a este uma tentativa e deixe-me saber como isso funciona para você.

graças, David

Outras dicas

Examinar o interior código gerado de T4MVC.cs. Existem as extensões html auxiliares que tomam um ActionLink. Seu vai ter que escrever uma sobrecarga que leva um outro conjunto de valores de rota e as combina com o ActionResult.GetRouteValueDictionary ().

    public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, ActionResult result, IDictionary<string, object> htmlAttributes) {
        return htmlHelper.RouteLink(linkText, result.GetRouteValueDictionary(), htmlAttributes);
    }

Graças jfar!

Aqui está o código que usei, apenas no caso de alguém precisa dele. Ele poderia usar um trabalho de refatoração, mas funciona

public static MvcHtmlString ActionLink<T>(this HtmlHelper<T> htmlHelper, string linkText, ActionResult result,
                                              object extraRouteValues, object htmlAttributes)
    {
        RouteValueDictionary completeRouteValues = result.GetRouteValueDictionary();
        RouteValueDictionary extraRouteValueDictionary = new RouteValueDictionary(extraRouteValues);
        foreach (KeyValuePair<string, object> foo in extraRouteValueDictionary)
        {
            completeRouteValues.Add(foo.Key, foo.Value);
        }

        Dictionary<string, object> htmlAttributesDictionary = htmlAttributes != null ? htmlAttributes.GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(htmlAttributes, null)) : null;

        return htmlHelper.RouteLink(linkText, completeRouteValues, htmlAttributesDictionary);
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top