Как доказывает этот поток, поместить значение переменной, такой как i, в элемент управления сервером непосредственно из разметки нетривиально. Как правильно заметил Джо, блоки рендеринга кода (<% = i%>) не работают в элементах управления сервера. Синтаксис <% = i%> отлично работает в теге html, но серверные элементы управления, как и ваша кнопка, его не поддерживают.
Я бы порекомендовал переместить поток управления из разметки в кодовую область с помощью повторителя. Это позволит вам установить аргументы команды из кода позади. Это намного больше соответствует принципам работы asp.net. Итак ...
<%for (int i = 0; i < 10; i++) %>
<%{ %>
<asp:Button runat="server" Text="Click Here" OnClick="MyButtonHandler" />
<%} %>
станет чем-то похожим на
<asp:Repeater ID="ButtonRepeater" runat="server"
onitemdatabound="ButtonRepeater_ItemDataBound">
<ItemTemplate>
<asp:Button id="MyButton" runat="server" Text="Click Here" OnClick="MyButtonHandler" />
</ItemTemplate>
</asp:Repeater>
Конечно, вы все равно можете добавить все HTML, которые хотите, в теги ItemTemplate. Затем в коде добавьте следующее.
protected void Page_Load(object sender, EventArgs e)
{
this.ButtonRepeater.DataSource = new[] { 1, 2, 3, 4, 5 }; // however many items you want
this.ButtonRepeater.DataBind();
}
protected void MyButtonHandler(Object sender, EventArgs e)
{
Button b = sender as Button;
if (b != null)
{
string cmdName = b.CommandName;
// logic based on cmdName
}
}
protected void ButtonRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var button = e.Item.FindControl("MyButton") as Button;
if (button != null)
{
var buttonNumber = e.Item.DataItem.ToString();
button.CommandName = buttonNumber;
button.ID = string.Format("MyButton_{0}", buttonNumber); // required to prevent event validation error
}
}
Я на самом деле проверил это, поместив точку останова в обработчике событий над переменной cmdName. Он был настроен на основе кнопки, которую я нажал.
Это изменение парадигмы, но это изменение, соответствующее целям ASP.NET.