Asp.Net Web Forms runat=server的HTML控件属性绑定<%#: Item %>不生效如何解决?
问题原因
普通HTML控件添加runat="server"标记后会被ASP.NET识别为服务器控件,直接写在属性值内部的<%# %>数据绑定表达式不会被引擎解析,只会作为普通字符串输出,就会出现原始代码直接渲染的问题。
解决方案
方案1:调整属性绑定写法(优先推荐,无需修改后台代码)
将整个属性的取值逻辑都放到数据绑定表达式内部,属性外层用单引号包裹避免语法冲突即可正确解析:
<a id="RepeaterElement" runat="server" href='<%# "?code=" + Item %>'><%#: Item %></a>
如果参数存在特殊字符,还可以主动加URL编码避免异常:
<a id="RepeaterElement" runat="server" href='<%# "?code=" + HttpUtility.UrlEncode(Item.ToString()) %>'><%#: Item %></a>
方案2:通过Repeater的ItemDataBound事件后台赋值
如果需要处理更复杂的属性逻辑,可以在后台绑定事件中操作控件:
- 先给Repeater绑定ItemDataBound事件:
<asp:Repeater ID="MyRepeater" runat="server" OnItemDataBound="MyRepeater_ItemDataBound"> <ItemTemplate> <a id="RepeaterElement" runat="server"><%#: Item %></a> </ItemTemplate> </asp:Repeater>
- 后台.cs文件添加事件处理逻辑:
protected void MyRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) { // 仅处理数据行,跳过表头、表尾等行 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { // 获取当前行绑定的数据源值 string currentCode = e.Item.DataItem as string; // 查找当前行内的服务器端a标签 HtmlAnchor linkCtrl = e.Item.FindControl("RepeaterElement") as HtmlAnchor; if (linkCtrl != null) { linkCtrl.HRef = "?code=" + currentCode; // 也可以在此处添加其他自定义属性 linkCtrl.Attributes["target"] = "_blank"; } } }
内容的提问来源于stack exchange,提问作者Megrez7
相关产品推荐
相关产品推荐

