J'ai une page Web où les utilisateurs doivent entrer les informations de contact client. Ils pourraient entrer de 0 à un nombre infini de contacts.
J'ai créé ce code de page sur la page: p> dans mon code derrière j'ai ajouté ceci: p> public void btnAddContact_Click(object sender, EventArgs e)
{
IList<CustomerContactProfile> customerContacts = new List<CustomerContactProfile>();
if (ViewState["CustomerContactList"] != null)
customerContacts = (List<CustomerContactProfile>)ViewState["CustomerContactList"];
CustomerContactProfile contactProfile = (CustomerContactProfile)LoadControl("~/Controls/Embedded/CustomerContactProfile.ascx");
customerContacts.Add(contactProfile);
foreach (CustomerContactProfile contact in customerContacts)
phCustomerContacts.Controls.Add(contact);
ViewState["CustomerContactList"] = customerContacts;
}
6 Réponses :
Je ne suis pas sûr que ce soit un meilleur moyen d'ajouter des contacts de manière dynamique. Ne serait-il pas préférable de créer des contrôles via jQuery et d'envoyer des données pour la création à la méthode Web? P>
JQuery est probablement mieux. Je ne l'ai jamais utilisé.
Il serait préférable de stocker le nombre de contrôles dans la visionneuse pour ajouter à la place ... puis les ajouter à la page init ou préinit ... Viewstate serait alors conservé pour chacun des contrôles dynamiques. Ce serait pour des post-packs après le clic bouton. P>
hth. p>
@Brain - Cela fonctionnerait, sauf que je perdrais toutes les informations sous la forme.
Aucune opinion de ViewState ne conserve que les informations modifiées, à condition que vous ajoutez les contrôles à l'init ou à la préinit.
Plutôt que de stocker tout le contrôle, stockez simplement les données sous-jacentes en session et reconstruisez le jeu de contrôle à partir de ces données chaque fois que vous rechargez la page. P>
Comment géreriez-vous les données dans le contrôle modifiées? Par exemple, le contrôle a une zone de texte - si la valeur de la boîte de texte est modifiée et la page rechargée, la valeur modifiée serait remplacée par les données sous-jacentes de la session.
Stockez le nombre de contrôles que l'utilisateur est entré dans l'état de vue. Remplacez la méthode de la page LoadViewstate et additionnez le nombre de commandes. Le cadre veillera à recharger les données publiées dans les commandes pour vous. Vous ne perdrez pas d'informations. Il vous suffit de vous assurer d'ajouter les commandes avant la restauration de la visualisation. P>
Stockez-le dans la session au lieu de ViewState. C'est aussi mauvais mais ça marchera! P>
Je pense que vous ne devriez pas dépendre d'un stockage temporaire pour cela - Viewstate, Session ou Autrement. P>
Vous semblez utiliser votre .ascx comme je voudrais normalement utiliser une classe ... Le contrôle de l'utilisateur va être plus grand, cependant, j'imagine, car il a beaucoup de HTML dedans (?). P>
Quoi qu'il en soit, une liste générique d'une classe serait ... plus petite, au moins. p>
Mais sinon, mon approche préférée est simplement d'insérer chaque enregistrement dans une base de données lorsqu'elle est faite (un par une) - au moins pour la saisie manuelle, qui est mon impression de ce que vous travaillez. Par exemple, en utilisant une liste ListView, DétailsView, GridView, etc. P>
Une raison particulière qu'il doit être dans le spectacle? Vous pouvez essayer la session à la place.
La session irait bien, mais si l'utilisateur quitte la page, il ne remplirait pas la session?
La session n'est absolument pas la place pour l'état basé sur la page. Pour un, cela signifie que, à moins que vous ne preniez des mesures supplémentaires, l'utilisateur n'a pas pu voir deux de ces pages en deux fenêtres distinctes - qui devraient être possibles dans la plupart des applications Web.
Que faites-vous avec ces contacts une fois que l'utilisateur les pénètre? Seront-ils stockés quelque part, de sorte que lorsque l'utilisateur tire la page du client, ils seront toujours là (j'imagine que c'est le cas)?
@Keith - Oui, ils seront mis dans la base de données à l'aide de l'ensemble de l'entité