2011-06-16 9 views
8

Estoy usando el MvcSiteMapProvider de http://mvcsitemap.codeplex.com/ para crear un rastro de navegación para mi proyecto. Tengo algunas URL que necesitan una ID para pasar a la información actual para el usuario apropiado, p. http: // localhost: 52306/Home/User? ID = 101101MVC Sitemap Provider - Mantenimiento de los parámetros de URL en el rastro de navegación

Cuando navego más en el mapa del sitio (ej. http: // localhost: 52306/Home/User/Details? ID = 101101) y trato de usar El enlace de ruta de navegación para llevarme de vuelta a la página "Usuario", el parámetro ID se pierde. Intenté agregar los atributos de SiteMapPreserveRouteData a los métodos de acción, pero parece que no están haciendo nada. ¿Hay alguna manera fácil de garantizar que se conserve esta información de identificación? Pensé que se suponía que el SiteMapPreserveRouteDataAttribute hiciera esto, entonces ¿hay algo que estoy haciendo mal con el atributo? Mi método sería este:

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

Avísame si necesitas más información de mi parte.

+0

Tengo el mismo desafío ... ¿Has encontrado una solución? – noocyte

Respuesta

0

De acuerdo con este hilo en MVCSiteMapperProvider no puede usar cadenas de consulta. Ignora cadenas de consulta y solo usa datos de ruta.

Query Strings and MVCSiteMapper

¿Ha pensado en la creación de algunas nuevas rutas en lugar de utilizar la cadena de consulta?

1

De la forma en que lo hice, tomé original mvc site map helper source para renderizar la ruta de navegación, y la cambié para manejar parámetros (aunque en mi proyecto solo mostramos parámetros para filtrar y permitimos que el usuario haga clic en ellos para perder otros parámetros de filtrado; aplicación ingenua de texto del nodo, sólo un ejemplo de cómo se puede hacer):

private static string SiteMapText(this MvcSiteMapHtmlHelper helper, SiteMapNode node, string linkCssClass, IDictionary<string, object> 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)); 

     // here you add request parameters 
     var title = helper.HtmlHelper.Encode(string.Format("{0} ({1})", node.Title, string.Join(";", queryParams))); 

     if (!string.IsNullOrEmpty(linkCssClass)) 
     { 
      spanHtml = string.Format("<span><span class=\"{0}\"{1}>{2}</span>", linkCssClass, extraAttributes, title); 
     } 
     else 
     { 
      spanHtml = string.Format("<span><span{1}>{0}</span>", title, extraAttributes); 
     } 

     return spanHtml; 
    } 

de la misma manera se puede ajustar métodos SiteMapLink, para incluir parámetros de la petición para el nodo actual.

Cuestiones relacionadas