繁体   English   中英

ASP.net中的foreach,带有嵌套runat =“ server”

[英]foreach in ASP.net with nested runat=“server”

对于以下代码:

<% foreach (Entities.Core.Location loc in locations){ %>
<div class="place_meta">
<img src="~/static/images/stars/star_25_sml.gif" runat="server" class="star_rating"/>
</div>
<% }; %>

我想显示每个位置对象的星级图像。 但是,仅显示第一个位置对象的星级。 其余的图像标签变为<img class="star_rating" />

我是否在语法中缺少任何东西,使语法无法在aspx页面上的foreach中使用runat = server进行控制? 这是与ASP.net 2.0。

我可能会在代码隐藏区或显示类中调用函数以绝对映射URL,但我很好奇是否有解决此问题的方法。

只是为了澄清起见,每个位置对象的图像路径可能都不同。

您不能在串联循环中使用服务器控件,因为ASP.NET需要能够唯一地标识每个控件以对其进行处理。 for ...循环可防止这种情况。 最简单,最干净的方法是使用Repeater控件并将您的集合绑定到它(在代码后面)。 在绑定事件处理程序中设置URL属性,并在绑定时维护一个计数器变量,以检查您是否在第一项。

编辑:我对此进行了更多研究,发现如果分配ID属性,则所有循环的实例都将获得相同的ID,但是ASP.NET只识别找到的第一个控件。 仅在第一个实例上设置属性是一种极其肮脏的方法。 请不要写这样的代码。

除非您使用MVC,否则在这种情况下您可能会发现中继器控件更有用。

如果我没记错的话,可以使用数据源(在此实例中为您的位置 ),然后遍历并设置每个图像。

我不知道您的代码是否应该工作,但这是;-)

<asp:Image ImageUrl="~/static/images/stars/star_25_sml.gif" runat="server" class="star_rating" />

也许这就是您要寻找的。

编辑:查看System.Web.UI.HtmlControls.HtmlImage的代码,您可以看到在(第一个)处理之后src属性被删除。 这可能就是为什么您的代码只能获得第一个正确的URI的原因。

我将删除runat="server"属性,并使用相对路径(或完整路径)而不是使用代字号来引用图像。

编辑: FWIW,@ miies的想法适合ASP.NET范式,并且是为什么我要切换到ASP.NET MVC的一个示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM