2009-03-12 8 views
0

J'ai une page plutôt complexe. La page ASPX charge un contrôle utilisateur qui à son tour charge un contrôle utilisateur enfant.Reliure déroulante et publications - ASP.NET

Parent contrôle

protected override void OnInit(EventArgs e) 
{ 
    //Loads child control 
} 

Dans le contrôle de l'utilisateur de l'enfant, j'utilise le contrôle personnalisé qui hérite de System.Web.UI.HtmlControls.HtmlSelect

ASCX:

<cust:CustDropDownList id="ctlDdl" runat="server"/> 

ASCX.CS

protected void Page_Load(object sender, EventArgs e) 
{ 
    //Binds CtlDdl here 
} 

Lorsque l'utilisateur clique sur le bouton Enregistrer, les contrôles obtiennent des contrôles utilisateur rechargés de façon dynamique, mais en sélectionnant la valeur que l'utilisateur a sélectionnée dans la liste déroulante. Je rencontre le problème de la poule et de l'œuf ici.

Je pense que je n'ai besoin de lier le ctlDdl que s'il n'y a pas de publication, mais cela n'a pas pour résultat que le menu déroulant ne soit pas rempli.

Si je lierai à chaque fois, je perds la sélection de l'utilisateur

EDIT: quelqu'un peut répondre à mon commentaire à la réponse de Jonathan? Merci

+0

Vérifiez si vous avez EnableViewState = "false" quelque part. Assurez-vous que c'est vrai. Chargez également votre contrôle après avoir vérifié si (! IsPostBack). –

Répondre

0

Avec les contrôles personnalisés, vous devez gérer l'état. Il y a une sorte d'effet de bulle où l'état est transmis. Si vous ne le faites pas, vous n'obtenez pas d'état.

Ce lien vous lancer: Server Control Custom State Management

Rechercher

Protected Overrides Sub LoadViewState(_ 
     ByVal savedState As Object) 
     Dim p As Pair = TryCast(savedState, Pair) 
     If p IsNot Nothing Then 
      MyBase.LoadViewState(p.First) 
      CType(Author, IStateManager).LoadViewState(p.Second) 
      Return 
     End If 
     MyBase.LoadViewState(savedState) 
    End Sub 

à Custom Property State Management Example

0

remplacer seulement la méthode OnInit dans le contrôle de l'utilisateur et charger le contrôle personnalisé à partir de cette méthode. ASP.NET définit le suivi viewstate après OnInit et avant PageLoad. Par conséquent, les valeurs par défaut définies lors du chargement du contrôle sont traitées comme des modifications par le moteur viewstate et sont réinitialisées lors de la publication.

Voir cet article sur viewstate pour une explication détaillée :

http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspx

+0

Je suis confus. ASP.NET gère-t-il viewstate à partir des contrôles hérités de System.Web.UI.HtmlControls? – DotnetDude

+0

Je suppose que le contrôle personnalisé utilise viewstate (la liste déroulante le ferait certainement) auquel cas, ASP.NET gérera le viewstate lorsqu'il sera ajouté à la collection de pages. –

+0

j'ai posé une question au sujet plus tôt http://stackoverflow.com/questions/606887/which-controls-have-viewstate-maintained et l'un de l'utilisateur dit que le framework .NET gère viewstate pour seulement ASP. Contrôles NET. Savez-vous si c'est correct? – DotnetDude