Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在中继器中使用环路吗?推荐吗?_C#_Asp.net_Loops_Repeater - Fatal编程技术网

C# 我可以在中继器中使用环路吗?推荐吗?

C# 我可以在中继器中使用环路吗?推荐吗?,c#,asp.net,loops,repeater,C#,Asp.net,Loops,Repeater,我的数据源有一个评级数据项包含一个从0到5的整数。我想用手风琴印星星 我正在尝试在中继器控制中执行此操作: <b>Rating:</b> <% for (int j = 1; j <= DataBinder.Eval(Container.DataItem, "Rating"); j++) { %> <img src="App_Pics/fullstar.png" /> <% } for (int j = 1; j <= 5 -

我的数据源有一个
评级
数据项包含一个从0到5的整数。我想用手风琴印星星

我正在尝试在
中继器
控制中执行此操作:

<b>Rating:</b>

<% for (int j = 1; j <= DataBinder.Eval(Container.DataItem, "Rating"); j++)
{  %>
<img src="App_Pics/fullstar.png" />
<% }
for (int j = 1; j <= 5 - DataBinder.Eval(Container.DataItem, "Rating"); j++)
{ %>
<img src="App_Pics/emptystar.png" />
<%} %>
评级:
#表示一个数据绑定项,这就是您看到前面提到的错误的原因;您正在其上下文之外使用数据绑定

最好的解决方案是将星级评定器转换为外部控件(ascx控件)。您可以添加一个名为“Rating”的属性,从数据绑定上下文分配它,并在star rater控件中执行循环。

表示数据绑定项,这就是您看到前面提到的错误的原因;您正在其上下文之外使用数据绑定


最好的解决方案是将星级评定器转换为外部控件(ascx控件)。您可以添加一个名为“Rating”的属性,从数据绑定上下文分配它,并在star rater控件中执行循环。

第2点,您当然可以执行,您可以在教程和其他内容中找到一些示例。就我个人而言,我喜欢尝试在codebehind中保留尽可能多的代码,但有时这并不值得…

第2点,你当然可以做到,你会在教程和其他内容中找到一些例子。就我个人而言,我喜欢尝试在codebehind中保留尽可能多的代码,但有时不值得这样做…

我不确定循环是否是一个使用
中继器
控件的好主意。更好的做法是循环
数据源
本身(在代码后面),因此
中继器
只需要一次迭代即可呈现HTML


如果您需要一些复合HTML结构来显示,我会使用jvenema的解决方案,并使用另一个
UserControl
来呈现它。

我不确定循环对于
中继器
控件是否是一个好主意。更好的做法是循环
数据源
本身(在代码后面),因此
中继器
只需要一次迭代即可呈现HTML

如果您需要一些复合HTML结构来显示,我会使用jvenema的解决方案,并使用另一个
UserControl
来呈现它。

#
指示当(即在控件或页面上调用
DataBind()
时)要执行的代码。
语法是与
等效的数据绑定,因此不幸的是,您不能将循环包装在
块中并完成它

您可以通过实现代码隐藏方法并将评级传递给该方法来绕过此限制:

<%# GetStars(Convert.ToInt32(DataBinder.Eval(Container.DataItem, "Rating"))) %>

然后将该方法实现为:

protected string GetStars(int rating)
{
    string output = string.Empty;
    for (int j = 1; j <= rating; j++) output += "<img src=\"App_Pics/fullstar.png\" />";
    for (int j = 1; j <= 5 - rating; j++) output += "<img src=\"App_Pics/emptystar.png\" />";
    return output;
}
受保护字符串GetStars(整数等级)
{
字符串输出=string.Empty;
对于(int j=1;j,
#
表示在控件或页面上调用
DataBind()
时要执行的代码。
语法是与
等效的数据绑定,因此不幸的是,您不能将循环包装在
块中并完成它

您可以通过实现代码隐藏方法并将评级传递给该方法来绕过此限制:

<%# GetStars(Convert.ToInt32(DataBinder.Eval(Container.DataItem, "Rating"))) %>

然后将该方法实现为:

protected string GetStars(int rating)
{
    string output = string.Empty;
    for (int j = 1; j <= rating; j++) output += "<img src=\"App_Pics/fullstar.png\" />";
    for (int j = 1; j <= 5 - rating; j++) output += "<img src=\"App_Pics/emptystar.png\" />";
    return output;
}
受保护字符串GetStars(整数等级)
{
字符串输出=string.Empty;

对于(int j=1;j我不建议这样使用循环。当然,有很多方法可以将5个图像放在一起,就像你需要的那样,打开或关闭星星,但另一个方法是简单地创建6个静态图像,打开0到5个星星。0star.jpg,1star.jpg,等等。然后你的“评级”值可以简单地用于生成适当的文件名。

我不建议以这种方式使用循环。当然,有几种方法可以将5个图像放在一起,就像你需要的那样,打开或关闭星号,但另一种方法是简单地创建6个静态图像,打开0到5个星号。0star.jpg,1star.jpg,等等。然后你的“评级”值可以简单地用于生成适当的文件名。

最好的方法是使用如下内容:

代码隐藏:

protected List<int> Stars = new List<int> { 1, 2, 3, 4, 5 };
protected int RankingStars = 3;
protectedlist Stars=新列表{1,2,3,4,5};
受保护的国际排名星=3;
aspx:

<asp:Repeater runat=server ID=C_Rep_StarsFull DataSource=Stars >
    <ItemTemplate>
          <img src="App_Pics/fullstar.png" runat=server 
                visible=<%# RankingStars >= (int)Container.DataItem %>/>
    </ItemTemplate>
</asp:Repeater>
<asp:Repeater runat=server ID=C_Rep_StarsEmpty DataSource=Stars >
    <ItemTemplate>
          <img  src="App_Pics/emptystar.png" runat=server 
                visible=<%# RankingStars < (int)Container.DataItem %>/>
    </ItemTemplate>
</asp:Repeater>

=(int)Container.DataItem%>/>
/>

对我来说,最好的选择是:

代码隐藏:

protected List<int> Stars = new List<int> { 1, 2, 3, 4, 5 };
protected int RankingStars = 3;
protectedlist Stars=新列表{1,2,3,4,5};
受保护的国际排名星=3;
aspx:

<asp:Repeater runat=server ID=C_Rep_StarsFull DataSource=Stars >
    <ItemTemplate>
          <img src="App_Pics/fullstar.png" runat=server 
                visible=<%# RankingStars >= (int)Container.DataItem %>/>
    </ItemTemplate>
</asp:Repeater>
<asp:Repeater runat=server ID=C_Rep_StarsEmpty DataSource=Stars >
    <ItemTemplate>
          <img  src="App_Pics/emptystar.png" runat=server 
                visible=<%# RankingStars < (int)Container.DataItem %>/>
    </ItemTemplate>
</asp:Repeater>

=(int)Container.DataItem%>/>
/>

实际上是两个不同的问题。问题A与DataBinder.Eval工作方式的细微差别有关。问题B更简洁地表述为“我应该嵌套循环吗?”.我认为,问题A才是您真正的问题。实际上是两个不同的问题。问题A涉及到DataBinder.Eval工作方式的细微差别。问题B更简洁地表述为“我应该嵌套循环吗?”.我想问题A才是你真正的问题。事实上,我最喜欢你的方式。谢谢。顺便说一句,output=”“和output=string.Empty之间有什么区别吗?@iTayb,string.Empty是指定空字符串值的首选方法,但不是每个人都同意。请看:两者之间没有实际区别“”和string.Empty。我使用它的唯一原因是为了证明我的意图(即我想创建一个空字符串)@sr pt:在这种情况下,使用StringBuilder实际上要慢一些。我刚刚运行了上面的循环和使用StringBuilder的变体一百万次,发现StringBuilder慢了大约18%。当然,每个循环大约需要0.0007MS,所以我在微优化剧场浪费了五分钟的时间。Argg。我只是想说明一点使用StringBuilder不一定是一个protip。这要视情况而定。事实上,我最喜欢你的方式。谢谢。顺便问一下,output=”“和output=string.Empty之间有什么区别吗?@iTayb,string.Empty是d的首选方法