【问题标题】:How to create RouteUrls with databound parameters declaratively?如何以声明方式创建带有数据绑定参数的 RouteUrls?
【发布时间】:2011-02-25 11:53:00
【问题描述】:

我正在使用 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>

现在我想知道是否可以将路由表达式语法和数据绑定语法结合起来。基本上我喜欢用&lt;%# Eval("ClientID") %&gt; 替换上面的常量2。但是以天真的方式这样做......

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

... 不起作用:&lt;%# Eval("ClientID") %&gt; 未评估但被视为字符串。到目前为止,使用多种引号也无济于事(大多数情况下是解析器错误)。

问题:我想在这里实现的目标有可能吗?如果是,正确的方法是什么?

提前谢谢你!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 很好,工作正常!我刚刚使用此解决方案更改了我的标记。非常感谢!
    • 注意:至少在 C# 中,您需要使用 ' 而不是 " 作为 NavigateUrl。只需将示例 1 复制为 1 即可。
    【解决方案2】:

    我知道这与 Samu Lan 的解决方案基本相同,但您可以使用常规的 HTML 锚控件来代替使用 .net 控件。

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

    【讨论】:

      猜你喜欢
      • 2019-11-06
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2011-08-23
      • 2016-03-27
      相关资源
      最近更新 更多