5

一般的な問題:

私はこれに似たものを作成しようとしています:

ここに画像の説明を入力

ユーザーはドロップダウンから製品を選択し、[追加] をクリックすると、[追加された製品] セクションの下に別の製品行が追加されます。各行のドロップダウンから追加された製品ごとに「製品記述子」を選択する必要があります。ユーザーが [送信] ボタンをクリックした場合にのみ、各製品行がデータベースに挿入されます。

質問:

ポストバック間で製品の選択を保持する最良の方法は何ですか?

「製品記述子」の選択を保持することについては心配していません。それができると信じています。私の主な関心事は、これらの一時的な選択をデータベースに保存する前に保存する最善の方法を見つけることです。

私の現在のアプローチ:

私が今やっている方法は、ビューステートで ProductListItem オブジェクトのリストを管理することです。このリストは、追加された製品を表示する ListView にバインドされています。

Private Property SelectedProductList As List(Of ProductListItem)
        Get
            Return CType(ViewState("SelectedProductList"), List(Of ProductListItem ))
        End Get
        Set(ByVal value As List(Of ProductListItem ))
            ViewState("SelectedProductList") = value
        End Set
End Property

ProductListItem クラス:

<Serializable()>
Public Class ProductListItem

    Public Property ProductID As Integer
    Public Property ProductName As String

    ' ProductDescriptor class represents Product Descriptor (details omitted)
    Public Property Descriptor As ProductDescriptor 

    ' Constructor omitted

End Class

Add Button Click ハンドラー:

 Protected Sub btnAddProduct_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddProduct.Click

        SelectedProductList.Add( New ProductListItem(...) )
        ProductListView.DataSource = SelectedProductList
        ProductListView.DataBind()

  End Sub

ここではViewstateの代わりにSessionを使用することを考えています.同じページに他にも2つの同様の状況があり、ビューステートにオブジェクトのリストを保持しており、Viewstateが破損したり取得したりするのが心配です.大きすぎる。どう思いますか?

御時間ありがとうございます!

4

2 に答える 2

2

あなたが最善の方法を求めたので、jQuery + knockoutJS を使用します。

従来の WebForms アプローチに固執したい場合は、エレガントにしないのはなぜですか?? これらすべてを処理する単純な UserControl を作成します (UpdatePanel動的コントロールと組み合わせて使用​​することもできます)。これらのコントロールを動的に追加するだけで済みます (ページのライフサイクルを知っていれば簡単です)。私の GitHub サイトにいくつかの実例があります。

コントロールでは、タイプのプロパティを公開ProductListItemし、ページでは、選択したすべての製品 (UserControls) を反復処理し、単純にProductListItemプロパティを要求します。

このようにして、ASP.NET と調和して作業できます。

編集 1

さらに、これに基づいて:

同じページに他にも 2 つの同様の状況があるため、ここでは Viewstate の代わりに Session を使用することを考えています。

おそらく、コントロールはあなたにとって最良の選択です

セッションを使用することはお勧めしません。個人的な選択として、Sessionサーバー リソースを解放するためにセッションをできるだけ使用しないようにしています。代わりに、クライアント側のスクリプトを使用して、ユーザーの PC の機能をできるだけ使用します。必要に応じて Web アプリケーションを簡単にスケーリングする方法

于 2012-10-18T17:09:15.307 に答える
1

ビューステートは解決策です。セッションでそれらを保存すると、次の主な問題が発生するためです。

  • ユーザーが送信を押す前にセッションが失われる可能性があります
  • ユーザーは同じコンテンツで複数のウィンドウを開くことができますが、セッションは同じであり、大きな混乱が発生します。

さて、ビューステートで大きくなりすぎないようにするには、次のことを(すべて一緒に)行うことができます。

  • それを圧縮する
  • それを分割します。
  • 書き込む内容を最適化します。たとえば、DropDownListの100レコードを書き込むか、その100レコードを取得するSQLselectだけを書き込むことができます。

また、すべてのデータをまとめて保持するクラスを作成し、それを最適化して、ビューステートに保存することもできます。ページを読み込むたびに、このクラスを使用してページフォームを再作成します。

ビューステート用にクラスを最適化する方法

ビューステート最適化の詳細:

ページを提供する前にASP.NETページのビューステートのサイズを決定する
http://www.codeproject.com/Articles/14733/ViewState-Compressionhttp://www.hanselman.com/blog/ZippingCompressingViewStateInASPNET.aspxhttp://www.bloggingdeveloper .com / post / How-To-Compress-ViewState-in-ASPNET-20-ViewState-Compression-with-SystemIOCompression.aspx

于 2012-10-18T17:00:17.957 に答える