如何以声明方式创建具有数据绑定参数的RouteUrls?

时间:2010-05-29 14:11:14

标签: asp.net data-binding url-routing asp.net-4.0 asp.net-routing

我正在使用ASP.NET 4中的新路由功能(Web表单,而不是MVC)。现在我有一个asp:ListView绑定到数据源。其中一个属性是ClientID,我想用它来链接ListView项目到另一个页面。在global.asax我定义了一条路线:

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

因此,如果ClientID = 2,则http://server/MyClientPage/2是有效的URL。

在ListView项目中,我有一个asp:HyperLink,以便我可以创建链接:

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

虽然这有效但我更喜欢使用RouteUrl表达式来使用RouteName而不是硬编码路由。例如,使用常量ClientID = 2,我可以写:

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

现在我想知道我是否可以组合路由表达式语法和数据绑定语法。基本上我喜欢用2替换上面的常量<%# Eval("ClientID") %>。但这是以天真的方式做到这一点......

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

...不起作用:<%# Eval("ClientID") %>未被评估,但被视为字符串。到目前为止,使用几种引号也无济于事(大多数情况下都是Parser错误)。

问题:我在这里想要达到的目标是否可行?如果是,那么正确的方法是什么?

提前谢谢!

2 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:1)

我知道它与Samu Lan的解决方案基本相同,但不是使用.net控件,而是可以使用常规的HTML锚控件。

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