如何在NavigateUrl中使用Eval?含RouteUrl代码示例问询
嘿,我来帮你搞定这两个ASP.NET中关于数据绑定和路由URL的问题!
1. 如何在NavigateUrl中使用Eval表达式?
在ASP.NET Web Forms里,给NavigateUrl绑定动态值最常用的方式就是数据绑定表达式<%# %>,它会在控件执行DataBind()方法时求值。这里有两种常见场景:
直接拼接普通URL
如果只是把字段值拼接到普通URL里,直接用字符串拼接就行,注意引号嵌套(外层用单引号,避免和内层双引号冲突):
<asp:HyperLink runat="server" ID="hlItemLink" NavigateUrl='<%# "ProductDetails.aspx?ProductID=" + Eval("ProductID") %>' Text='<%# Eval("ProductName") %>'> </asp:HyperLink>
绑定到路由URL(适配路由系统)
如果项目用了ASP.NET路由,想要生成符合路由规则的URL,就得在数据绑定表达式里调用GetRouteUrl方法——别用<%$ RouteUrl %>表达式构建器,它没办法嵌套Eval。
2. 修正你的RouteUrl+Eval嵌套代码
你原来的写法NavigateUrl="<%$ RouteUrl:RouteName=Kurumsal, ModulBaslik=<%# Eval("ModulResim")%>%>"有个核心问题:<%$ %>表达式构建器和<%# %>数据绑定表达式的执行时机完全不同。
<%$ %>在页面解析初始化阶段就会被处理,这时候数据绑定还没开始,Eval("ModulResim")根本不会被求值,会直接被当成字面量处理,导致URL完全错误。<%# %>是在数据绑定阶段(比如GridView.DataBind()执行时)才会计算值。
正确的做法是用<%# %>包裹整个路由URL的生成逻辑,调用GetRouteUrl方法生成符合规则的URL:
<asp:HyperLink runat="server" ID="hlKurumsalLink" NavigateUrl='<%# GetRouteUrl("Kurumsal", new { ModulBaslik = Eval("ModulResim") }) %>' Text='<%# Eval("ModulBaslik") %>'> </asp:HyperLink>
额外注意事项
- 如果
Eval("ModulResim")返回的是object类型,建议加上.ToString()确保类型正确,避免潜在的空引用问题:NavigateUrl='<%# GetRouteUrl("Kurumsal", new { ModulBaslik = Eval("ModulResim")?.ToString() }) %>' - 要确保你的路由规则
Kurumsal已经在Global.asax或者路由配置类中正确定义,并且包含ModulBaslik这个参数。
内容的提问来源于stack exchange,提问作者Mesut önal
相关产品推荐
相关产品推荐

