首页 > 解决方案 > 按钮循环 ASP.NET

问题描述

在过去的两个小时里,我一直被困住,需要帮助。我已经尝试了我可以在网上找到的每一个示例,但它们都不起作用。我正在构建一个网页,ASP.NET并想要制作一个按钮列表。好像不太难吧?它一直在给我带来问题。

这是我的代码:

<ul>
  <form id="tagloop" runat="server">
    <% foreach (string i in data)%>
      <%Response.Write("<li><button runat=\"server\" type=\"submit\" onserverclick=\"ClickTag\">" + i + "</button></li>");%>
  </form>
</ul>

如果我删除Response.Write()它只循环一次,但它生成的一个按钮实际上可以工作并在点击时调用该方法。此外,变量 i 不适用。

<ul>
  <form id="tagloop" runat="server">
    <% foreach (string i in data)%>
      <li><button runat="server" type="submit" onserverclick="ClickTag"> i </button></li>
  </form>
</ul>

无论如何我可以让它循环,在数据中有 i 的文本,并在点击时调用正确的函数?我还没有找到这三者的平衡点,我们将不胜感激。

标签: c#htmlasp.net

解决方案


如果要创建服务器端控件,最好使用asp:Repeater

<asp:Repeater runat="server" ID="Repeater1" OnItemCommand="Repeater1_ItemCommand">
    <ItemTemplate>
        <li>
            <asp:Button runat="server"  ID="RepeaterButton" Text="<%# Container.DataItem %>" OnClick="RepeaterButton_Click"/>
        </li>
    </ItemTemplate>
</asp:Repeater>

protected void Page_Load(object sender, EventArgs e)
{    
    if(IsPostBack) return;
    var data = new List<string> { "Test1", "Test2", "Test3", "Test4" };
    Repeater1.DataSource = data;

    Repeater1.DataBind();
}

您必须编写更多代码,但避免在标记中添加太多逻辑,并且不必使用容易出错和拼写错误的 Response.Write。

你甚至可以用强类型对象来做到这一点!假设你有一个 person 类:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

而且您的 .cs 文件中有一个方法可以返回人员列表:

IEnumerable<Person> Persons()
{
    for (int i = 0; i < 10; i++)
    {
        yield return new Person { FirstName = $"Foo{i}", LastName = $"Bar{i}" };
    }
}

然后,您可以在转发器控件中引用您的对象属性:

<asp:Repeater runat="server" ID="Repeater1" ItemType="WebFormsSandbox.Person">
    <ItemTemplate>
        <li>
            <asp:Button runat="server"  ID="RepeaterButton" Text="<%#: Item.FirstName %>  <%#: Item.LastName %>" OnClick="RepeaterButton_Click"/>

        </li>
    </ItemTemplate>
</asp:Repeater>

参考:https ://msdn.microsoft.com/en-us/library/x8f2zez5(v=vs.100).aspx


推荐阅读