如何在回发时获取 asp.net 中继器内文本框中的文本?

How to get text in textbox inside an asp.net repeater on postback?

我在 Page Init 上将数据绑定到转发器:

    protected void Page_Init(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            repeaterInfo.DataSource = //getDataSource;
            repeaterInfo.DataBind();
        }
    }

这是标记页面

<table class="beautifulTable">
   <asp:Repeater runat="server" ID="repeaterInfo" OnItemCreated="repeaterInfo_ItemCreated">
      <ItemTemplate>
         <tr>
            <td style="display: none">
               <asp:TextBox runat="server" Width="90%" ID="txtUserInput"></asp:TextBox>
            </td>
         </tr>
      </ItemTemplate>
   </asp:Repeater>
</table>

这是项目创建事件:

protected void repeaterInfo_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.DataItem == null)
                return;
            
            TextBox txtUserInput= e.Item.FindControl("txtUserInput") as TextBox;
            txtUserInput.Text = "0.0"; //Default value
        }

我想在用户单击提交按钮时将用户输入保存到数据库中:

protected void btnSubmit_Click(object sender, EventArgs e)
{
            List<repeaterType> source = repeaterInfo.DataSource as List<repeaterType>;
            for (int z = 0; z < source.Count; z++)
            {
                TextBox txtUserInput = repeaterInfo.Items[z].FindControl("txtUserInput") as TextBox;
                //Get text and do logic here
            }
            //Saves data to database
}

问题是:

The repeaterInfo datasource is null on postback

If I remove the !IsPostBack, the txtUserInput text will be resetted (0.0)

我使用 EnableViewState="true"

在标记页面上启用了视图状态

如何获取 txtUserInput 中的文本?

中继器的数据源未在交叉回发中保留。如果您只想迭代并获取用户输入,您可以迭代这些项目并获得这样的项目:

foreach (RepeaterItem item in repeaterInfo.Items)
{
    if(item.ItemType == ListItemType.Item)
    {
        var txtUserInput = item.FindControl("txtUserInput") as TextBox;
    }
}

如果您希望持久化数据源(可能是为了避免数据库调用),请使用 ViewState(注意大量行):

ViewState["myDataSource"] = myDatasource;