ASP.NET中如何通过2个参数实现页面重定向?
解决ASP.NET HyperLink中Eval表达式未解析的问题
你的问题出在没有把整个URL拼接逻辑放在单个数据绑定表达式块中,导致服务器把<%#Eval(...)%>当成普通字符串进行URL编码,而没有执行绑定逻辑。另外你还漏写了第二个参数的键名(应该是Name=),这也会导致接收页面无法正确获取参数。
下面给你几个可行的解决方案:
方案1:在单个Eval块中用String.Format拼接URL
这是最直接的前端绑定方式,把所有参数拼接逻辑放在一个<%# ... %>块里:
<asp:HyperLink runat="server" id="h1" NavigateUrl='<%# String.Format("OrderFromSupplies.aspx?Gender={0}&Name={1}", Eval("Gender"), Eval("Name")) %>'> <%# Eval("Name") %> </asp:HyperLink><br/>
方案2:添加URL编码避免特殊字符问题
如果你的Gender或Name包含空格、中文或其他特殊字符,一定要进行URL编码,否则参数传递会出错。可以用HttpUtility.UrlEncode处理:
<asp:HyperLink runat="server" id="h1" NavigateUrl='<%# String.Format("OrderFromSupplies.aspx?Gender={0}&Name={1}", HttpUtility.UrlEncode(Eval("Gender").ToString()), HttpUtility.UrlEncode(Eval("Name").ToString())) %>'> <%# Eval("Name") %> </asp:HyperLink><br/>
注意:需要确保页面引用了System.Web命名空间,否则HttpUtility会找不到。
方案3:后台代码绑定(适合复杂逻辑)
如果是在GridView/Repeater这类数据控件中,也可以在RowDataBound(GridView)或ItemDataBound(Repeater)事件中手动设置HyperLink的属性:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { // 只处理数据行,忽略表头/表尾 if (e.Row.RowType == DataControlRowType.DataRow) { HyperLink h1 = (HyperLink)e.Row.FindControl("h1"); string gender = DataBinder.Eval(e.Row.DataItem, "Gender").ToString(); string name = DataBinder.Eval(e.Row.DataItem, "Name").ToString(); // 同样记得编码 h1.NavigateUrl = $"OrderFromSupplies.aspx?Gender={HttpUtility.UrlEncode(gender)}&Name={HttpUtility.UrlEncode(name)}"; h1.Text = name; } }
为什么原来的写法不行?
ASP.NET服务器控件的属性值如果包含多个<%# ... %>块,服务器不会把它们当成独立的绑定表达式执行,而是会把这些代码块当成普通文本进行转义(比如把<转成%3C),最终就出现了你看到的那种包含未解析Eval代码的URL。只有当整个属性值被包裹在一个完整的<%# ... %>绑定块中时,服务器才会执行其中的表达式逻辑。
内容的提问来源于stack exchange,提问作者יובל פרייברג
相关产品推荐
相关产品推荐

