0

Ich habe das folgende Problem. Ich habe MVC SiteMap eingerichtet, aber es gibt einen Knoten, den ich den Parameter speichern (beibehalten) muss. Technisch gesehen ist das Problem erklärt:MVC SiteMap übergeordnete Parameter nicht beibehalten

Ich habe Route: Agent/Prüflisten/Vorlagen, von dort ich bestimmte Vorlage am Öffnen Agent/Checklisten/EditTemplate/1 (wobei 1 die id) dann von dort: Ich bin Öffnung Seite, der Agent/Prozesse/hinzufügen

In der letzten Seite ist habe ich die Brotkrumen-: Vorlagen> Vorlage bearbeiten> Add-Prozess

Und jetzt will ich, wenn ich auf Vorlage bearbeiten klicken, um mich an den Agenten weitergeleitet/Checklisten/EditTemplate/1

Ich habe versucht, SiteMapPreserveRouteData Decorator auf die Aktion zu setzen, aber sie sagt, dass sie veraltet ist.

Hier ist meine Mvc.sitemap

<mvcSiteMapNode title="Templates" controller="Checklists" action="Templates" area ="Agent"> 
     <mvcSiteMapNode title="Edit Template" controller="Checklists" action="EditTemplate" area="Agent" preservedRouteParameters="id"> 
      <mvcSiteMapNode title="Add Process" controller="Processes" action="Add" area="Agent" preservedRouteParameters="id, id" /> 
      <mvcSiteMapNode title="Process Configuration" controller="Processes" action="Edit" area="Agent" preservedRouteParameters="token" /> 
     </mvcSiteMapNode> 
     </mvcSiteMapNode> 

Dank

Antwort

0

Konservierte Routenparameter von die aktuelle Anforderung erhalten bleiben. Daher muss jeder Routenschlüssel innerhalb desselben Knotenstamms eindeutig sein. Mit anderen Worten, wenn Sie preservedRouteParameters verwenden, können Sie id nicht erneut für einen anderen Zweck (andere Entität) verwenden.

Mit preservedRouteParameters arbeitet der Routenwert id nur für eine Ebene. Wenn Sie Ebenen tiefer verschachteln, müssen Sie für jede Ebene einen eindeutigen Routenschlüssel erstellen.

Und Sie müssen sicherstellen, dass Sie die Parameter des übergeordneten Knotens für jeden Vorfahren beibehalten, oder die URL wird nicht korrekt erstellt.

<mvcSiteMapNode title="Templates" controller="Checklists" action="Templates" area="Agent"> 
    <mvcSiteMapNode title="Edit Template" controller="Checklists" action="EditTemplate" area="Agent" preservedRouteParameters="checklistId"> 
     <mvcSiteMapNode title="Add Process" controller="Processes" action="Add" area="Agent" preservedRouteParameters="processId,checklistId" /> 
     <mvcSiteMapNode title="Process Configuration" controller="Processes" action="Edit" area="Agent" preservedRouteParameters="token,processId,checklistId" /> 
    </mvcSiteMapNode> 
</mvcSiteMapNode> 

Eine einfache Möglichkeit, dies zu verwalten, ist das Hinzufügen einer Route pro Controller.

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Checklists", 
      "Checklists/{action}/{checklistId}", 
      new { controller = "Checklists", action = "Index", checklistId = UrlParameter.Optional }); 

     routes.MapRoute(
      "Processes", 
      "Processes/{action}/{processId}", 
      new { controller = "Processes", action = "Index", processId = UrlParameter.Optional }); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

Dann müssen Sie die Abstammung Daten zu jeder URL hinzufügen.

@Html.ActionLink("Edit Process", "Edit", "Process", new { token = "1234", processId = "5678", checklistId = "23" } , null) 

Siehe these demos für Proben mit beiden preservedRouteParameters und dynamischen Knoten Anbietern.

+0

Nach einigem Lesen der Dokumentation habe ich verstanden, wie conservedRouteParameters funktionieren. Aber wir haben dieses System, bei dem Eltern eine ID und der Kindknoten eine andere ID hat. Dann kam es mir in den Sinn, benutzerdefinierte Attribute zu speichern und die SiteMapNodeModel.cshtml zu überschreiben, um die URL korrekt zu erstellen, aber kein Glück, es merkt sich die Attribute für die aktuelle Anfrage, aber wenn ich in das Kind gehe, sind die Attribute für die Eltern verloren. Ich muss zugeben, dass ich mit den Funktionen, die in dieser Funktion zur Verfügung stehen, nicht zufrieden bin, da ich nur einen Stapel benötige, auf dem genau die Routen genannt werden. –

+0

Es gibt nichts, was Sie daran hindert, preservedRouteParameters zu löschen und nur einen Knoten für jeden Wert hinzuzufügen (das Standardverhalten), weshalb ich dynamische Knotenanbieter erwähnt habe. conservedRouteParamters funktioniert nur unter bestimmten Bedingungen - einer davon ist, dass die gesamte Herkunft nicht den gleichen Routenschlüssel duplizieren darf. Es skaliert besser, wenn Sie CRUD-Operationen durchführen, hat aber viel weniger Flexibilität. – NightOwl888

+0

Hmm, die Geschäftssituation ist die folgende: Ich öffne ein Template mit einer ID, und von dort aus öffne ich einen Prozess mit einem Token (anders als das Template Token). Auch habe ich die folgende Situation: Person Datei> Beschäftigung> Job> Beenden Job wo alle von ihnen ID-Parameter haben und ich sehe keine mögliche Option, um dies zu lösen. So schaue ich auf dein dynamisches Beispiel, aber das löst mich nur eine Ebene ich denke. Und ich habe viele Stellen im System, wo ich das erreichen müsste, also wird es statisch geschrieben. –

Verwandte Themen