2009-04-02 9 views
0

J'ai eu un problème avec un bouton de contrôle dans les webforms asp.net. Après avoir utilisé mvc un peu, j'ai commencé à utiliser foreach dans les fichiers aspx dans les formulaires Web aussi, au lieu de répéteurs, principalement cause de tous les indésirable viewstate créé par un répéteur.asp.net web-forms commandargument problème

Cela fonctionne très bien lorsque vous passez juste sur les contrôles html. Mais j'ai eu du mal avec les boutons de contrôle.

<% foreach (var r in Reports) { %> 
    <asp:LinkButton OnClick="Click_DeleteResult" CommandArgument='<%= r.ResultId.ToString() %>' runat="server">Delete</asp:LinkButton> 
<% } %> 

postback le CommandArgument sur ce bouton devient "<% = r.ResultId.ToString()%>". Donc, ce code n'est pas exécuté. Existe-t-il un bon moyen de remplir les propriétés de contrôle de cette façon?

Répondre

0

C'est moche. L'avantage # 1 d'utiliser ASP.NET (en particulier MVC) est de séparer la logique et la présentation. Je grince chaque fois que je dois regarder dans un fichier aspx pour l'exécution du code.

Si vous n'aimez pas le «rebut» de ViewState, éteignez-le pour ce contrôle!

<asp:Repeater ID="MyRepeater" runat="server" EnableViewState="false"> 

Si vous insistez sur ce bien ... Je l'ai vu ce genre de situations où ASP.NET ne serait pas analyser correctement une balise de serveur à moins que je laissa tomber les guillemets. Comme si:

CommandArgument=<%= r.ResultId.ToString() %> 

Peut ne pas être complètement conforme HTML, mais ASP.NET s'en fout. Si vous avez vraiment besoin de sortir ces citations entourant pour une raison quelconque, vous pouvez les mettre dans l'étiquette du serveur au lieu de l'extérieur. C'est contre-intuitif, mais parfois vous devez le faire de cette façon.

0

Avez-vous essayé une expression DataBinding

<%# r.ResultId %> 
-1

Que diriez-vous de l'ajouter via le code derrière, ceci est un exemple rapide et sale mais je pense que vous avez l'idée:

HtmlTable table = new HtmlTable(); 
foreach (var r in Reports) 
{ 
    LinkButton lnkbtn = new LinkButton(); 
    lnkbtn.CommandArgument = r.ResultId; 
    lnkbtn.Click += Click_DeleteResult; 
    HtmlTableRow tr = new HtmlTableRow(); 
    HtmlTableCell tc_resultID = new HtmlTableCell(); 
    tc_caseNo.Controls.Add(lnkbtn); 
    tr.Cells.Add(tc_resultID); 
    table.Rows.Add(tr); 
} 
div_yourContainerDiv.Controls.Add(table); 

Je préfère parfois cette solution .. dépend de l'assignation .. Cependant, il y a probablement une solution pour votre problème actuel qui ne vous oblige pas à le prendre derrière le code :)

Si vous travaillez beaucoup Avec un contenu générique, il peut être une très bonne façon de le faire sans aucun code de déchet viewstate qui gâche tout pour les SE. Alternativement, vous pouvez faire quelque chose que j'ai fait avec succès avec certains projets critiques SEO. Vous pouvez prendre et enregistrer viewstate en tant que session et créer une clé de session à viewstate à la place. De cette façon, vous laissez le serveur gérer le viewstate plutôt que le client. Cela crée une charge de serveur supplémentaire mais il y aura toujours des compromis.

Questions connexes