formulaires Web asp.net les meilleures pratiques pour récupérer les valeurs de contrôle de serveur dynamique
-
04-10-2019 - |
Question
Je remplir un formulaire Web avec liste dynamique des examens de base de données. Je veux que l'utilisateur de saisir des signes d'examen pour chaque examen. Il y a la liste des titres d'examen et près de chaque zone de texte.
Je crée la liste avec le contrôle de répéteur (ViewState est désactivé):
<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>
Et lier des données à répétition sur 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();
}
Jusqu'à présent, si bon. Ensuite, je dois récupérer des données sur postback. J'ai deux façons, mais deux d'entre eux semble laid. L'idée consiste à stocker les commandes databounded créées dynamiquement sur ItemDataBoundEvent dans l'étape de Page_Init, et le traitement de leurs valeurs dans l'étape Load. Il ressemble à ceci:
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
}
...
Je suis tout à fait sûr qu'il ya une meilleure façon de récupérer des données à partir de commandes créées dynamiquement. Merci d'avance!
La solution
Voici comment vous pouvez le faire:
Tout d'abord, ne redéfinissez pas les données lors de la publication - ce n'est pas nécessaire. Seulement bind sur le premier appel de la page.
protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack){
rptExams.DataSource = Exams;
rptExams.DataBind();
}
}
Vous aurez pas besoin du dictionnaire ni.
Ensuite, sur un postback, vous pouvez accéder aux données liées comme suit:
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
}
}
}