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>

وربط البيانات للمكرر على page_init:

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();
}

حتى الان جيدة جدا. ثم لا بد لي من استرداد البيانات على Postback. لدي طريقان لكن كلاهما يبدو قبيحًا. تتمثل Idea في تخزين عناصر التحكم التي تم إنشاؤها ديناميكيًا على 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 
        }
...

أنا متأكد تمامًا من وجود طريقة أفضل لاسترداد البيانات من عناصر التحكم التي تم إنشاؤها ديناميكيًا. شكرا لكم مقدما!

هل كانت مفيدة؟

المحلول

إليك كيف يمكنك أن تفعل ذلك:

أولاً ، لا تعيد ربط البيانات على Postback - فهي ليست ضرورية. فقط ربطها على المكالمة الأولى للصفحة.

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

لن تحتاج إلى القاموس لا.

بعد ذلك ، في Postback ، يمكنك الوصول إلى البيانات المربوطة على النحو التالي:

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