asp.net web表单检索动态服务器控件值的最佳实践

asp.net web表单检索动态服务器控件值的最佳实践,asp.net,server-side-controls,Asp.net,Server Side Controls,我用数据库中的动态考试列表填充web表单。我希望用户为每次考试输入考试分数。考试题目列表和每个题目旁边的文本框 我使用repeater控件创建列表(ViewState已禁用): 到目前为止还不错。然后我必须在回发时检索数据。我有两种方法,但都很难看。 其思想是将动态创建的数据绑定控件存储在Page_Init阶段的ItemDataBoundEvent上,并在Page_Load阶段处理它们的值。看起来是这样的: private Dictionary<HiddenField, TextBox&g

我用数据库中的动态考试列表填充web表单。我希望用户为每次考试输入考试分数。考试题目列表和每个题目旁边的文本框

我使用repeater控件创建列表(ViewState已禁用):

到目前为止还不错。然后我必须在回发时检索数据。我有两种方法,但都很难看。 其思想是将动态创建的数据绑定控件存储在Page_Init阶段的ItemDataBoundEvent上,并在Page_Load阶段处理它们的值。看起来是这样的:

private Dictionary<HiddenField, TextBox> Id2Mark = new Dictionary<HiddenField, TextBox>();

protected void rptExams_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    ...
    if (IsPostBack)
    {
        var tbMark = (TextBox)e.Item.FindControl("tbMark");
        var hfId = (HiddenField)e.Item.FindControl("hfId");

        // store dynamically created controls 
        Id2Mark.Add(hfId, tbMark);
    } 
    ...    
}

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (var pair in Id2Mark)
        {
            int examId = Int32.Parse(pair.Key.Value);
            string mark = pair.Value.Text;
            // PROCESS 
        }
...
private Dictionary Id2Mark=new Dictionary();
受保护的无效RPTU项目数据绑定(对象发送方、RepeaterItemEventArgs e)
{
...
如果(iPostBack)
{
var tbMark=(文本框)e.Item.FindControl(“tbMark”);
var hfId=(HiddenField)e.Item.FindControl(“hfId”);
//存储动态创建的控件
Id2Mark.Add(hfId、tbMark);
} 
...    
}
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(iPostBack)
{
foreach(Id2Mark中的var对)
{
int examId=Int32.Parse(pair.Key.Value);
字符串标记=pair.Value.Text;
//过程
}
...

我完全相信有一种更好的方法可以从动态创建的控件中检索数据。请提前感谢!

以下是您的方法:

首先,不要在回发时重新绑定数据-这不是必需的。只在页面的第一次调用时绑定它

protected void Page_Init(object sender, EventArgs e)
{
    if (!IsPostBack){
        rptExams.DataSource = Exams;
        rptExams.DataBind();
    }
}
你也不需要这本字典

然后,在回发中,您可以按如下方式获得绑定的数据:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (RepeaterItem item in rptExams.Items)
        {
            HiddenField hfId = item.FindControl("hfId") as HiddenField;
            TextBox tbMark = item.FindControl("tbMark") as TextBox;

            int examId = Int32.Parse(hfId);
            string mark = tbMark.Text;
            // PROCESS 
        }
    }
}

好的,谢谢!即使禁用了ViewState,这种方法也应该有效。我仍然可以在服务器上填充我的列表,然后在需要时迭代Repeater.Items!:)不客气!是的,如果您在每次回发时都重新绑定,这在禁用ViewState的情况下也有效。
protected void Page_Init(object sender, EventArgs e)
{
    if (!IsPostBack){
        rptExams.DataSource = Exams;
        rptExams.DataBind();
    }
}
protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (RepeaterItem item in rptExams.Items)
        {
            HiddenField hfId = item.FindControl("hfId") as HiddenField;
            TextBox tbMark = item.FindControl("tbMark") as TextBox;

            int examId = Int32.Parse(hfId);
            string mark = tbMark.Text;
            // PROCESS 
        }
    }
}