4

J'utilise la nouvelle fonctionnalité de routage dans ASP.NET 4 (formulaires Web, pas MVC). Maintenant j'ai un asp: ListView qui est lié à une source de données. L'une des propriétés est un ClientID que je souhaite utiliser pour lier les éléments ListView à une autre page. Dans global.asax J'ai défini un itinéraire:Comment créer des RouteUrls avec des paramètres de databound de manière déclarative?

System.Web.Routing.RouteTable.Routes.MapPageRoute("ClientRoute", 
    "MyClientPage/{ClientID}", "~/Client.aspx"); 

de telle sorte que, par exemple http://server/MyClientPage/2 est une URL valide si ClientID = 2 existe.

Dans les articles ListView J'ai un asp: HyperLink pour que je puisse créer le lien:

<asp:HyperLink ID="HyperLinkClient" runat="server" 
    NavigateUrl='<%# "~/MyClientPage/"+Eval("ClientID") %>' > 
    Go to Client details 
</asp:HyperLink> 

Bien que cela fonctionne, je préférerais utiliser le RouteName au lieu de la route hardcoded en utilisant une expression de RouteUrl. Par exemple, avec une constante ClientID = 2 Je pourrais écrire:

<asp:HyperLink ID="HyperLinkClient" runat="server" 
    NavigateUrl="<%$ RouteUrl:ClientID=2,RouteName=ClientRoute %>" > 
    Go to Client details 
</asp:HyperLink> 

Maintenant, je me demande si je peux combiner la syntaxe d'expression de l'itinéraire et la syntaxe de liaison de données. Fondamentalement, j'aime remplacer la constante 2 ci-dessus par <%# Eval("ClientID") %>. Mais faire cela d'une manière naïve ...

<asp:HyperLink ID="HyperLinkClient" runat="server" 
    NavigateUrl='<%$ RouteUrl:ClientID=<%# Eval("ClientID") %>,RouteName=ClientRoute %>' > 
    Go to Client details 
</asp:HyperLink> 

... ne fonctionne pas: <%# Eval("ClientID") %> n'est pas évaluée mais considérée comme une chaîne. Jouer avec plusieurs saveurs de guillemets n'a pas aidé jusqu'à présent (erreurs d'analyse dans la plupart des cas). Question: Est-il possible du tout ce que j'essaye de réaliser ici? Et si oui, quelle est la bonne façon?

Merci d'avance!

Répondre

13

Utilisation System.Web.UI.Control.GetRouteUrl:

VB:

<asp:HyperLink ID="HyperLinkClient" runat="server" 
    NavigateUrl='<%# GetRouteUrl("ClientRoute", New With {.ClientID = Eval("ClientID")}) %>' > 
    Go to Client details 
</asp:HyperLink> 

C#:

<asp:HyperLink ID="HyperLinkClient" runat="server" 
    NavigateUrl='<%# GetRouteUrl("ClientRoute", new {ClientID = Eval("ClientID")}) %>' > 
    Go to Client details 
</asp:HyperLink> 
+0

Très bien, fonctionne très bien! Je viens de changer mon balisage en utilisant cette solution. Merci beaucoup! – Slauma

+1

Note: Au moins en C#, vous devez utiliser 'et non' pour votre NavigateUrl, il suffit de copier les exemples 1 pour 1 et tout ira bien. – scottheckel

1

Je sais qu'il est fondamentalement la même que la solution de Samu Lan, mais au lieu d'utiliser .net contrôles que vous pouvez utiliser régulièrement Contrôle d'ancrage HTML.

<a href='<%# GetRouteUrl("ClientRoute", new {ClientID = Eval("ClientID")}) %>'> 
    Go to Client details 
</a> 
Questions connexes