使用嵌套的runat =“server”在ASP.net中进行foreach

时间:2008-12-29 15:41:58

标签: c# asp.net

以下代码:

<% 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。

我可以在codebehind或display类中调用一个函数来绝对映射URL,但如果有解决这个问题的话,我很好奇。

仅为了澄清,每个位置对象的图像路径可能不同。

4 个答案:

答案 0 :(得分:3)

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

编辑:我已经玩了更多,并发现如果你分配一个ID属性,所有循环实例都会获得相同的ID,但ASP.NET只识别找到的第一个控件。这将是一种非常脏的方法,仅在第一个实例上设置属性。请不要写这样的代码。

答案 1 :(得分:1)

除非您使用MVC,否则在这种情况下您可能会发现Repeater Control更有用。

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

答案 2 :(得分:1)

我不知道你的代码是否应该有效,但这个代码是; - )

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

也许这就是你要找的东西。

编辑:查看System.Web.UI.HtmlControls.HtmlImage的代码,您可以看到src属性在(第一次)处理后被删除。这可能是您可以使用代码获得第一个URI的原因。

答案 3 :(得分:0)

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

编辑: FWIW,@ miies的想法符合ASP.NET范例,并且是我转换到ASP.NET MVC的一个例子。