Frage

Ich versuche, unsere Links auf umzustellen T4MVC, und ich habe ein kleines Problem mit Parametern, die nicht Teil der Signatur einer Aktion sind.Wir haben eine Route, die ungefähr so ​​aussieht:

http://www.mydomain.com/{fooKey}/{barKey}/{barID}

==> führt zu BarController.Details(barID).

fooKey und barKey werden nur zu SEO-Zwecken zu den Links hinzugefügt.(da bar eine untergeordnete Entität von foo ist und wir diese Hierarchie in der URL darstellen möchten)

Bisher würden wir verwenden

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

Und das würde uns zu BarController.Details(barID) führen, während fooKey und barKey in der URL beibehalten würden.

Da wir nun mit T4MVC begonnen haben, haben wir versucht, es auf zu ändern

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

Da barKey und fooKey nicht Teil der Aktionssignatur „Details“ sind, sind sie in der URL nicht mehr sichtbar.

Gibt es eine Möglichkeit, dies zu umgehen, ohne diese Parameter zur Aktionssignatur hinzufügen zu müssen?

War es hilfreich?

Lösung

Ähnliches gab es auch im T4MVC-Forum (dieser Thread).Ich denke, ich werde weitermachen und Unterstützung dafür in T4MVC hinzufügen.

Eigentlich habe ich mir gerade eine interessante Lösungsmöglichkeit ausgedacht.Das Problem beim Hinzufügen einer Überladung zur Übergabe zusätzlicher Argumente besteht darin, dass Sie allen anderen T4MVC-Erweiterungsmethoden, die ein ActionResult benötigen, ähnliche Überladungen hinzufügen müssten, was chaotisch werden kann.

Stattdessen können wir mit einem flüssigen Ansatz dies mit geringem Aufwand überall verfügbar machen.Die Idee ist, dass Sie schreiben:

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

Oder wenn Sie nur einen Wert hinzufügen müssen:

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

So wird AddRouteValues ​​implementiert:

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

Es wäre toll, wenn Sie es einmal ausprobieren könnten und mir mitteilen würden, wie das bei Ihnen funktioniert.

Danke David

Andere Tipps

Schauen Sie in den generierten Code innerhalb von T4MVC.cs. Es gibt die HTML-Helfer-Erweiterungen, die eine Action nehmen. Ihr gehen zu müssen, eine Überlastung schreiben, die einen anderen Satz von Routen Werte annimmt und verbindet sie mit dem ActionResult.GetRouteValueDictionary ().

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

Danke jfar!

Hier ist der Code, den ich verwenden, nur für den Fall, dass jemand braucht. Es könnte einen Refactoring Job verwenden, aber es funktioniert

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);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top