Web Asp.net формирует лучшую практику для получения динамических значений управления сервером

StackOverflow https://stackoverflow.com/questions/2900327

  •  04-10-2019
  •  | 
  •  

Вопрос

Я заполняю веб-форму с динамическим списком экзаменов из базы данных. Я хочу, чтобы пользователь вступил в экзаменные знаки для каждого экзамена. Существует список названий экзамена и текстовое поле рядом с каждым заголовком.

Я создаю список с элементом управления повторителем (ViewState отключен):

<asp:Repeater ID="rptExams" runat="server" onitemdatabound="rptExams_ItemDataBound" >    
        <ItemTemplate>        
                <tr>
                    <td>                        
                        <asp:Literal runat="server" ID="ltTitle"/>
                    </td>
                    <td>
                        <asp:HiddenField runat="server" ID="hfId"/>
                        <asp:Textbox runat="server" ID="tbMark"/>
                    </td>
                </tr>
        </ItemTemplate>    
    </asp:Repeater>

И свяжите данные для повторителя на странице_инит:

class Exam
{
    public int Id { get; set;}
    public string Title { get; set;}
}
...
// this list is retrieved from database actually 
Exam[] Exams = new Exam[]
{
    new Exam { Id = 1, Title = "Math"},
    new Exam { Id = 2, Title = "History"}                                        
};
...
protected void Page_Init(object sender, EventArgs e)
{
    rptExams.DataSource = Exams;
    rptExams.DataBind();
}

Все идет нормально. Тогда я должен получить данные о обратке. У меня есть два пути, но оба из них выглядят уродливыми. Идея состоит в том, чтобы хранить динамически созданные погашенные управляемые элементы управления на ItemDataboundEvent в этапе Page_init и обрабатывать их значения на этапе 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 
        }
...

Я полностью уверен, что есть лучший способ получить данные из динамически созданных элементов управления. Заранее спасибо!

Это было полезно?

Решение

Вот как вы можете сделать это:

Во-первых, не переписывайте данные о поступлении - это не нужно. Только связывайте его на первом вызове страницы.

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 
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top