0

J'ai le problème suivant. J'ai installé MVC SiteMap mais il y a un noeud dont j'ai besoin pour sauvegarder (préserver) le paramètre. Techniquement, le problème a expliqué:Les paramètres parent de MVC SiteMap ne sont pas conservés

J'ai itinéraire: Agent/listes de vérification/Modèles, à partir de là que je suis l'ouverture modèle spécifique, Agent/Listes de contrôle/EditTemplate/1 (où 1 est l'identifiant) ensuite à partir de là j'ouvre une nouvelle la page qui est agent/processus/Ajouter

Dans la dernière page, j'ai le fil d'Ariane: Modèles> Modifier le modèle> Ajouter processus

Et maintenant, je veux quand je clique sur Modifier le modèle pour me faire redirigé vers Agent/Listes de contrôle/EditTemplate/1

J'ai essayé de placer SiteMapPreserveRouteData décorateur sur l'Action mais il dit qu'il est obsolète.

Voici mon 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> 

Merci

Répondre

0

paramètres d'itinéraire sont conservés préservés de la demande actuelle. Par conséquent, chaque clé de routage doit être unique dans la même ascendance de noeud. En d'autres termes, lorsque vous utilisez preservedRouteParameters, vous ne pouvez pas réutiliser id à d'autres fins (entité différente).

En utilisant preservedRouteParameters, la valeur de route id ne fonctionnera que pour un niveau. Si vous imbriquez des niveaux plus profonds, vous devrez créer une clé de route unique pour chaque niveau.

Et vous devez vous assurer de conserver les paramètres du nœud parent pour chaque ancêtre, sinon l'URL ne sera pas construite correctement.

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

Une manière simple de gérer cela consiste à ajouter une route par contrôleur.

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

Ensuite, vous devez ajouter les données d'ascendance à chaque URL.

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

Voir these demos pour les échantillons d'utiliser les deux fournisseurs de noeuds preservedRouteParameters et dynamiques.

+0

Après avoir lu la documentation, j'ai compris comment fonctionne preserveRouteParameters. Mais nous avons ce type de système où le parent a un identifiant et le nœud enfant a un autre identifiant. Ensuite, il m'est venu à l'esprit de sauvegarder les attributs personnalisés et de surcharger SiteMapNodeModel.cshtml pour construire correctement l'URL mais pas de chance, il se souvient des attributs de la requête en cours mais quand je descends dans l'enfant, les attributs du parent sont perdus. Je dois admettre que je ne suis pas satisfait des fonctionnalités disponibles dans cette fonctionnalité car tout ce dont j'ai besoin est une pile avec exactement comment les routes ont été appelées. –

+0

Rien ne vous empêche d'abandonner preserveRouteParameters et d'ajouter un nœud pour chaque valeur (comportement par défaut), c'est pourquoi j'ai mentionné les fournisseurs de nœuds dynamiques. preserveRouteParamters ne fonctionne que dans des conditions spécifiques - l'une d'elles étant que l'ascendance entière ne doit pas dupliquer la même clé de route. Il évolue mieux si vous faites des opérations CRUD, mais a beaucoup moins de flexibilité. – NightOwl888

+0

Hmm, la situation de l'entreprise est la suivante: J'ouvre un modèle avec un identifiant, puis à partir de là j'ouvre un processus avec un jeton (différent du jeton de modèle). J'ai également la situation suivante: Fichier Personne> Emploi> Travail> Terminer un travail où tous ont un paramètre d'identifiant différent et je ne vois aucune option possible pour résoudre ce problème. Donc, je regarde votre exemple dynamique, mais cela ne me résout qu'un seul niveau, je suppose. –