Repeater コントロールを使用して、各項目のデータを保持するオブジェクトのリストにバインドします。コードビハインドですべて簡単かつ迅速に行うことができ、検証はクライアント側とサーバー側の両方で機能します。つまり、ユーザーがjavascriptをオフにしても機能します。
以下のように、データ クラスを定義します。
public class InputDataItem
{
public string Text { get; set; }
public InputDataItem()
{
}
public InputDataItem(string text)
{
this.Text = text;
}
}
およびマークアップ:
<asp:Repeater ID="rptInputs" runat="server">
<ItemTemplate>
<asp:TextBox ID="tbxInput" runat="server" Text='<%# Eval("Text") %>'></asp:TextBox>
<asp:RequiredFieldValidator ID="rqfValidator" runat="server" ControlToValidate="tbxInput" ErrorMessage="* Required!"></asp:RequiredFieldValidator>
</ItemTemplate>
</asp:Repeater>
<br />
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
リピーターをバインドし、このコードでユーザーが入力した値を取得します
protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack)
{
var data = new List<InputDataItem>();
for (int i = 0; i < 5; i++)
{
data.Add(new InputDataItem("Item " + i.ToString()));
}
rptInputs.DataSource = data;
rptInputs.DataBind();
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
if (IsValid)
{
var data = new List<InputDataItem>();
foreach (RepeaterItem rit in rptInputs.Items)
{
Control cnt = rit.FindControl("tbxInput");
if (cnt != null && cnt is TextBox)
data.Add(new InputDataItem((cnt as TextBox).Text));
}
/// here you have list of POCO objects filled with user input
}
}