2017-02-21 1 views
0

Comme l'indique le titre, l'URL de l'un des nœuds du fil d'Ariane est incorrecte. Je viens d'obtenir un http://localhost/#URL du nœud MvcSiteMapProvider rendue/#

Évidemment, j'ai quelque chose de mal. J'ai d'autres structures similaires dans le sitemap qui fonctionnent. Pouvez-vous dire de ce qui manque?

Je peux poster plus d'informations si nécessaire.

SiteMap:

<mvcSiteMapNode title="ISP" controller="xxx" action="Index"> 
    <mvcSiteMapNode title="PC" action="Details" preservedRouteParameters="pcId"> 
    <mvcSiteMapNode title="SGD" controller="yyy" action="Details" preservedRouteParameters="pcId, yyyId, editable"> 
     <mvcSiteMapNode title="ESGN" controller="yyy" action="Title" preservedRouteParameters="pcId, yyyId, editable" /> 
    </mvcSiteMapNode> 

Actions:

[HttpGet] 
    [Route("xxx/{pcId:int}/yyy/{yyyId:int}/Details/{editable:bool}")] 
    public virtual ActionResult Details(int pcId, int yyyId, bool editable) 
    { 


    [HttpGet] 
    [Route("xxx/{pcId:int}/yyy/{yyyId:int}/Title")] 
    public virtual ActionResult Title(int pcId, int yyyId) 
    { 

Itinéraire Carte:

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

Mise à jour: Lors du retrait du paramètre "modifiable" il a commencé à travailler. Pourrait-il y avoir un problème avec plus de 2 paramètres? ou éventuellement le type ou le nom du paramètre?

mise à jour suivant les conseils de débogage NightOwl88:

Le urlHelper fait générer l'URL correcte

Ceci est mon code du contrôleur:

[HttpGet] 
    [Route("TransactionDetails/File/{fileId:int}")] 
    public virtual ActionResult Index(int fileId) 
    { 
     { 
      var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData)); 
      var url = urlHelper.Action("Index", "Transaction", 
       new System.Web.Routing.RouteValueDictionary { { "id", 678 } }); 

      System.Diagnostics.Debug.WriteLine(url); 
     } 

     { 
      var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData)); 
      var url = urlHelper.Action("Index", "File", 
       new System.Web.Routing.RouteValueDictionary {{"fileId", 123}}); 

      System.Diagnostics.Debug.WriteLine(url); 
     } 

Je reçois: /AdministratorConsole/TransactionDetails/678 ​​ et /AdministratorConsole/TransactionDetails/File/123

Donc l'assistant est capable de générer une URL pour moi mais MvcSiteMapProvider n'est toujours pas content.

SiteMap est:

<mvcSiteMapNode title="Transaction Log" controller="TransactionLog" action="Index"> 
     <mvcSiteMapNode title="Transaction Details" controller="Transaction" action="Index" preservedRouteParameters="id"> 
     <mvcSiteMapNode title="File Details" controller="File" action="Index" preservedRouteParameters="id, fileId"> <!--TODO link back to parent not working--> 

Répondre

0

A # indique l'URL ne pouvait pas être résolue sur la base des informations fournies (entre la demande actuelle et ce qui est dans la configuration du nœud). Voir Why does Default UrlResolver throw an exception pour une explication.

MvcSiteMapProvider résout l'URL via la classe UrlHelper de MVC, donc si vous rencontrez des problèmes, vous devez use the UrlHelper explicitly pour résoudre le problème. Si vous placez le code ci-dessous dans un contrôleur et que vous le modifiez pour qu'il corresponde à la demande qui génère un #, vous serez en mesure de déterminer comment résoudre l'URL correctement. Cependant, contrairement à MvcSiteMapProvider, le UrlHelper renverra null si l'URL ne peut pas être résolue. La raison la plus probable est qu'il vous manque une valeur de route que vous avez définie comme requise par l'itinéraire.

// Using controller and action 
var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData)); 
var url = urlHelper.Action("View", "Videos", new System.Web.Routing.RouteValueDictionary { { "id", 123 } }); 

// Using controller, action, and route name (similar to @Html.RouteLink()) 
var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData)); 
var url = urlHelper.RouteUrl("RouteName", new System.Web.Routing.RouteValueDictionary { { "controller", "Videos" }, { "action", "View" }, { "id", 123 } }); 
+0

Merci de faire un essai. Il est intéressant de noter que le nœud qui a le problème obtient une bonne Url quand c'est le dernier nœud de la liste, mais pas quand il est le second à durer. –

+0

J'ai mis à jour ma question. UrlHelper génère une URL pour moi mais MvcSiteMapProvider ne l'est pas. Autre chose que je peux essayer? –