2011-02-07 16 views
8

私は、ユーザーが顧客の連絡先情報を入力する必要があるWebページを持っています。彼らは0から無限の連絡先に入ることができます。コントロールのリストにコントロールを動的に追加する

私はページ上のこのページのコード作成:私はこれを追加した背後に私のコードでは

<ajaxToolkit:ToolkitScriptManager runat="Server" EnablePartialRendering="true" ID="ScriptManager1" /> 
<asp:PlaceHolder ID="phCustomerContacts" runat="server" EnableViewState="true">/asp:PlaceHolder> 
<asp:LinkButton ID="btnAddContact" runat="server" OnClick="btnAddContact_Click" CssClass="LinkButton" Text="Add Contact"/> 

を:

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; 
    } 

ViewStateはすべてを保存する処理できないため、このコードは動作しません。その制御データ。しかし、すでに追加されたコントロールを別の方法で保存することはできません。

コントロールのビューステートは何も保存せず、ユーザーがいくつかのデータを最初のコントロールに入れて、2番目のコントロールを追加したときにデータが失われないようにする必要があります。そうです。

+1

Viewstateにある特別な理由はありますか?代わりにSessionを試すことができます。 – asawyer

+0

セッションはうまくいくが、ユーザーがページを離れるとセッションがいっぱいになることはないだろうか? –

+1

セッションは、ページベースの状態のための場所ではありません。 1つは、余計な対策を講じない限り、ユーザーは2つの別々のウィンドウで2つのページを表示できないことです。これはほとんどのWebアプリケーションで可能になるはずです。 –

答えて

1

コントロール全体を格納するのではなく、基本データをセッションに格納し、ページをリロードするたびにそのデータからコントロールセットを再構築するだけです。

+0

変更されているコントロールのデータをどのように処理しますか?たとえば、コントロールにはテキストボックスがあります。テキストボックスの値が変更され、ページがリロードされた場合、変更された値はセッションの基になるデータに置き換えられます。 – PTuckley

0

私はそれがコンタクトを動的に追加する最良の方法であるとは確信していません。 jqueryでコントロールを作成し、作成するデータをWebメソッドに送信するほうがよいでしょうか?

+0

jqueryはおそらく良いでしょう。私は一度も使ったことがありません。 –

0

代わりに、追加するビューステートのコントロールの数を格納することをお勧めします。Pag​​e InitまたはPreInitに追加します。ViewStateは各ダイナミックコントロールに対して保持されます。これはもちろん、ボタンをクリックした後のポストバック用です。

HTH。

+0

@Brain - フォームのすべての情報を失うことを除いて、それはうまくいくはずです。 –

+0

initまたはpreinitでコントロールを追加する限り、viewstateは変更された情報を保持しません。 –

0

ユーザーがビューステートに入力したコントロールの数を格納します。 LoadViewStateページメソッドをオーバーライドし、そこにコントロールの数を追加します。フレームワークは、投稿されたデータをコントロールに再読み込みします。あなたは情報を失うことはありません。ビューステートが復元される前に、コントロールを追加してください。

0

ViewstateではなくSessionに格納します。それはちょうど悪いですが、うまくいくでしょう!

0

私はあなたがViewstate、Session、またはその他のための一時的なストレージに依存してはいけないと思う。

私は通常、クラスを使用するようにあなたの.ascxを使用しているようです...ユーザーコントロールは、それにはたくさんのHTMLを持っているので、想像しています。

とにかく、クラスの一般的なリストは、少なくとも小さくなります。

しかし、そうでなければ、私が気に入っている方法は、完了したらデータベースに各レコードを挿入することです - 少なくとも手動入力の場合は、それはあなたの作業の印象です。たとえば、リストビュー、詳細ビュー、グリッドビューなどを使用します。

関連する問題