9 Stimmen

MVC Sitemap Provider - Beibehaltung von URL-Parametern im Breadcrumb-Trail

Ich verwende den MvcSiteMapProvider von http://mvcsitemap.codeplex.com/, um einen Breadcrumb-Trail für mein Projekt zu erstellen. Ich habe einige URLs, bei denen eine ID übergeben werden muss, um Informationen für den entsprechenden Benutzer anzuzeigen, z.B. http://localhost:52306/Home/User?ID=101101

Wenn ich weiter in die Sitemap navigiere (z.B. http://localhost:52306/Home/User/Details?ID=101101) und versuche, den Breadcrumb-Link zu verwenden, um mich zurück zur "Benutzer"-Seite zu bringen, geht der ID-Parameter verloren. Ich habe versucht, SiteMapPreserveRouteData-Attribute zu den Aktionsmethoden hinzuzufügen, aber anscheinend funktionieren sie nicht. Gibt es einen einfachen Weg, um sicherzustellen, dass diese ID-Informationen erhalten bleiben? Ich dachte, das SiteMapPreserveRouteDataAttribute sollte dies tun, also mache ich etwas falsch mit dem Attribut? Meine Methode würde so aussehen:

[SiteMapPreserveRouteData]
public ActionResult User()
{
  //code
}

Lassen Sie mich wissen, wenn Sie weitere Informationen von mir benötigen.

1voto

Giedrius Punkte 8248

Wie ich es gemacht habe: Ich habe den originalen MVC-Sitemap-Helfer-Quellcode für die Darstellung des Breadcrumb genommen und ihn so geändert, dass er Parameter verarbeiten kann (obwohl in meinem Projekt nur Parameter für die Filterung angezeigt werden und es dem Benutzer erlaubt wird, darauf zu klicken, um andere Filterparameter zu verlieren. Unten finden Sie eine sehr naive Implementierung des Knotentexts, nur ein Beispiel, wie es gemacht werden kann):

private static string SiteMapText(this MvcSiteMapHtmlHelper helper, SiteMapNode node, string linkCssClass, IDictionary htmlAttributes)
{
    var extraAttributes = new StringBuilder();
    foreach (var attribute in htmlAttributes)
    {
        extraAttributes.Append(" " + attribute.Key + "=\"" + attribute.Value + "\"");
    }            

    string spanHtml;
    var paramDictionary = helper.HtmlHelper.ViewContext.RequestContext.HttpContext.Request.Params.ToDictionary();
    var queryParams = paramDictionary.Select(x => string.Format("{0}:{1}", x.Key, x.Value));

    // hier fügst du die Anfrageparameter hinzu
    var title = helper.HtmlHelper.Encode(string.Format("{0} ({1})", node.Title, string.Join(";", queryParams)));

    if (!string.IsNullOrEmpty(linkCssClass))
    {
        spanHtml = string.Format("{2}", linkCssClass, extraAttributes, title);
    }
    else
    {
        spanHtml = string.Format("{0}", title, extraAttributes);
    }

    return spanHtml;
}

Auf die gleiche Weise können Sie die SiteMapLink-Methoden anpassen, um die Anfrageparameter für den aktuellen Knoten einzuschließen.

0voto

Ryand.Johnson Punkte 1886

Laut diesem Thread auf MVCSiteMapperProvider können Sie keine Abfragezeichenfolgen verwenden. Es ignoriert Abfragezeichenfolgen und verwendet nur Routendaten.

Abfragezeichenfolgen und MVCSiteMapper

Haben Sie schon darüber nachgedacht, einige neue Routen zu erstellen, anstatt die Abfragezeichenfolge zu verwenden?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X