2011-02-03 22 views
2

ORIGINAL POSTASP.NET動的制御の追加

あり記事のトンがそこにいると、私の特定の質問のためにSO上でここに掲載答えよりも多くの質問。

は、私は、処理のためために入るから選択することができ製品ユーザーのDropDownListコントロールを持つことになりますことを作成していたWebページを持っています。それに加えて、オプションアクセサリを含む2つの他のDropDownListコントロールがそれぞれ製品にあります。私は、ユーザが複数の製品行を注文オブジェクトに対応するオプションおよび/または*アクセサリと一緒に入力できるようにしたいと考えています。これにより、データベース内に顧客情報を格納するレコードの量が削減されます。

ユーザーがこのDropDownListコントロールから選択されたとして、私は製品のリストを作成したいと思いますが、このリストには、ユーザーが特定のの順序のために入力する必要がある製品の数に基づいて動的に作成する必要があります。 ViewStateに自動的に保存されず、正しい方向にデータをプッシュする方法がわからないため、データを保存する必要があることを理解しています。

ViewStateを扱う複雑さのために、私のWebページを作成するためにASP.NET以外のものを使用したいのですか?それは複雑かもしれませんが、そのような行動のコースを試みるときに使用するより良い方法がありますか?

EDIT

だから、私の調査結果は、それが追加されるよう適切にデータを格納するために、私は私のデータを含むDictionaryオブジェクトにすることをRepeaterコントロールとのDataBindを使用すべきであると信じているように私にもたらしていますKeyValuePairs。私はこれを行うための単純な方法を探しています。代わりに、必要なすべてのデータを含むオブジェクトを直接追加するだけです。私は確かにこのクラスをRepeaterとDataBindに追加することができますが、Repeaterからデータを再水和することによって、私はいくつかの問題以上の原因になります。

public class Order 
{ 
    public Order() { } 
    public string CustomerNamer { get; set; } 
    public ProductList ProductOrdered { get; set; } 
} 
public class ProductList : List<Product> 
{ 
    public ProductList() { } 
} 
public class Product 
{ 
    public Product() { } 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string ProdcutCode { get; set; } 
} 

BEHIND CODE:私はこのパターンを何度も成功裡に使用しましレンダリングされたページにRepeaterを通じて表現される動的なコレクションの場合

protected void order_add_Click(object sender, EventArgs e) 
{ 
     Dictionary<int, Order> objOrders = new Dictionary<int, Order>(); 

     Order objOrder = new Order(); 
     Product objProduct = new Product(); 

     objProduct.Name = "Tire"; 
     objProduct.ProductCode = "75R15"; 

     objOrder.ProductsOrdered = new ProductList(); 

     objOrder.ProductsOrdered.Add(objProduct); 

     objOrders.Add(0, objOrder); 

     rptTest.DataSource = objOrders; 
     rptTest.DataBind(); 
} 
+0

.NETの使用やViewStateの複雑さに問題はありません。あなたがデータをプッシュしようとしている「正しい方向」は何ですか?データベース、セッション...? – capdragon

+0

現時点では、ViewStateに格納された情報を必要とするので、PostBackでは、送信または保存ボタンを使用して、コントロールを取得して、データをMySql DALにポストするためのデータオブジェクトクラスに読み込むことができます。 – Jeff

答えて

0

インを作成します。情報を表すことができるメモリ構造。

この構造体をページのプロパティとして公開し、適切に内部でSessionまたはViewStateに格納します。リピーターへ

public List<Order> Orders { get { return ViewState("OrdersList"); } set { ViewState("OrdersList") = value; } }

DataBind()と結合あなたのメモリ内のオブジェクトがレンダリングされたときに、それがどのように見えるはずです何に変換しています。

ポストバックでは、リピータからの変更を読み取り、メモリ内のデータ構造を更新します(Page_Loadハンドラ - >if (!IsPostback) {...})。

選択をDBに保存する(または注文などを送信する)ときは、単にインメモリストアから情報を読み込みます。

+1

ViewStateにオブジェクトの完全なリストを配置すると、クライアントに送り返されるHTMLページのサイズが大きくなる可能性があるため、パフォーマンスに影響を与える可能性があります。 –

+0

@Simon Mourier:ユーザーがASPXページで機能的に作成しているため、ViewStateにオブジェクトを格納していない場合は、どこに保存しますか?私はすべての耳です。 – Jeff

+0

@Simon Mourier:これは本当です - ViewStateが成長するにつれてパフォーマンスが低下します。代わりに、 'SavePageStateToPersistenceMedium()'と 'LoadPageStateFromPersistenceMedium'イベントハンドラをオーバーライドすることで、サーバー上に残っているSessionを使用するか、' Page'をオーバーライドしてViewStateを(Sessionのように)他の場所に保持することができます。 (http://msdn.microsoft.com/en-us/library/ms972976.aspx#viewstate_topic10) – Leon

関連する問題