2011-09-14 3 views
7

リピータのビューステート、つまりリピータ内のコントロールがビューステートを維持していないという問題があります。私は、次のしているリピータのビューステートの維持

リピータ1:リンクボタンがクリックされると

<asp:Repeater ID="rptImages" runat="server"> 
<ItemTemplate> 
    <asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" /> 
</ItemTemplate> 
</asp:Repeater> 

をCommandArgumentの値は、ページ上の隠しフィールドに格納されています。

ポストバック時に、プリレンダーイベントハンドラがロードされるまで、非表示フィールドの値を取得できません。私が保存されたら

public List<string> ImageList { 
    get { 
     if (this.ViewState["ImageList"] == null) { 
      this.ViewState["ImageList"] = new List<string>(); 
     } 
     return (List<string>)(this.ViewState["ImageList"]); 
    } 
    set { this.ViewState["ImageString"] = value; } 
} 

if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) { 
     this.ImageList.Add(this.SelectedImageIDsInput.Text); 
    } 

とリストプロパティので、次のようになりますので、はのようなので、私のPreRenderイベントで、私は隠しフィールドの値を取得し、Listプロパティに格納します私のリストのプロパティに値が、私は(再びPreRenderイベント内で)私の第二の中継をバインド:

this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList; 
this.rptSelectedImages.DataBind(); 

二リピータは、その中のドロップダウンリストとテキストボックスがあります。問題は、これらの子コントロールのビューステートが維持されていないことです。それぞれのポストバックでリピータを再バインドしているため、再構築されていると推測します。私が知らないことは、どうすればこれを得ることができるのだろうか? ImageListプロパティはポストバック時にのみ更新されるので、明らかにそれぞれのポストバックでリピータを再バインドする必要があります。それ以外の方法は可能ですか?

ご協力いただければ幸いです。

おかげ アル

答えて

13

あなたがリピーターを再バインドしている場合は、ViewStateがロードされる前にInitでそれを行う必要があります。

また、IsPostbackフラグをチェックして、ページが転記されていないときにのみリピーターをバインドする必要があります。 Init後、およびPreLoad前に - 2番目のリピータはPreRenderにバインドされている場合、彼らは単にViewStateがロードされたときに存在しないため、その後ViewStateは、コントロールを永続化するために使用することはできません明確にする

Initで(または変更時に)一度バインドするリストにアクセスできるように、すべてのポストバックでバインドを続けるか、Sessionに保存またはリストする必要があります。

+0

こんにちはCodeKing:あなたはあなたにこのようなLinkButtonClickイベントを処理することができます。 2つの問題があります - 私はInitイベントのように早く隠されたフィールドの価値を得ることができません。さらに、ImageListプロパティはポストバックでしか更新できません..... – higgsy

+0

その場合、2番目のリピータを再バインドする必要があります隠しフィールドの値を使用してすべての呼び出しで。 – TheCodeKing

+0

こんにちはCodeKing - まさに私がやっていることはそれではありませんか?私はあなたの反応を誤解しています。私は現在、onprerenderが隠しフィールドの値を取得し、リピータを再バインドするまで待つ - この問題は、リピータのコントロールのviewstateがポストバックを超えて保持されない... – higgsy

0

CommandArgumentプロパティを隠しフィールドにコピーする点はありません。何をすべきかは、RepeaterItemCommandイベントを使用し、イベントのバブルを使用することです。

repeater.ItemCommand += (sender, eventArgs) => { 
    var commandArgument = eventArgs.CommandArguments; 
    ImageList.Add(commandArgument); 
    rptSelectedImages.DataSource = ImageList; 
    rptSelectedImages.DataBind(); 
} 
+0

こんにちはミカエル - 私はそれが隠されたフィールドにそれをコピーすることは狂っているようです。問題は、同じページにjQuery画像をアップロードすることです。ファイルがアップロードされると、新しいImageIdが返されます。もちろん、JSはImageList.Addを呼び出すことができないため、隠しフィールドに格納する必要があります。それは理にかなっていますか? – higgsy

関連する問題