0

ObjectDataSourceを持つGridViewがあります。ユーザーが複数のオブジェクトを作成して、一度に保存できるようにしたいと思います。

背景:レシピのエディターを作成したい。レシピには基本プロパティ(名前や出所など)と材料(100 gバターなど)があります。ユーザーがレシピのすべてのプロパティを設定し、データベースに保存する前に(!!)その材料を定義できるようにします。また、リストから成分を削除できる必要があります。最初にレシピを保存してから材料を定義することはオプションではありません。

私の質問: 材料をデータベースに保存する前に、どこに保管すればよいですか?

これは私が見つけたものです:

  1. ObectDataSourceのGetDataメソッドは静的であり、したがってビューステートにアクセスできないため、ViewStateはオプションではありません。
  2. ユーザーは同じブラウザの異なるタブで同じページを同時に使用できる必要があるため、セッションはオプションではありません。
  3. コンテキストはコールバック後も存続しないため、オプションではありません。
  4. データソースがlinqデータコンテキストでない場合、削除操作をサポートしていないため、ObectDataSourceの代わりにLinqDataSourceを使用しても機能しません。
  5. (正しいセッションオブジェクトを識別するために)QueryStringで一意のIDを使用することは回避策ですが、URLを台無しにします。

私はしばらくの間ウェブを検索してきました、そして私は成功せずに多くのことを試みました。

助けてくれてありがとう!

4

2 に答える 2

0

おそらく最善の策は、ページが最初に読み込まれるときに一時IDを作成することです。それを非表示のフィールドに保存して、viewstateがそれを認識できるようにします。

ある種のカスタムクラスを使用して、グリッドのデータを表します。データソースコントロールを使用する代わりに、グリッドのDataSourceプロパティとDataMemberプロパティを使用してオブジェクトを手動でバインドします。

生成した一時IDをキーとして使用して、このオブジェクトをキャッシュに保存します。

各ポストバックで、キャッシュ内のオブジェクトを更新し、グリッドに再バインドします。

ビューステートは、一時IDを介してクライアントのIDを維持するメカニズムです。asp.net Cache APIは、サーバー上のデータ状態を維持します。

于 2010-01-08T11:49:48.660 に答える
0

これ以上エレガントに解決する方法はないように思われるので、すべての Web フォームの継承元である基本ページ クラスに次のコードを実装しました。

/// <summary>
/// Set an ID to identify the correct session variable (in case there are several ones).
/// Create this ID when it is needed for the first time.
/// </summary>
private string PageCallID
{
    get
    {
        if (ViewState["PageCallID"] == null) ViewState["PageCallID"] = Guid.NewGuid().ToString("N");
        return ViewState["PageCallID"].ToString();
    }
}

/// <summary>
/// Use a hashtable which is stored into the Session to save the in-memory
/// objects. This helps to keep the viewstate variable at the client small.
/// </summary>
protected Hashtable ServerViewState
{
    get
    {
        string strSessionKey = String.Format("CleverViewState_{0}", PageCallID);
        if (Session[strSessionKey] == null) Session[strSessionKey] = new Hashtable();
        return (Hashtable)Session[strSessionKey];
    }
}

これにより、任意の Web フォームに書き込むことができます。

ServerViewState["MyDataTable"] = myDataTable;

それ以外の

ViewState["MyDataTable"] = myDataTable;

ただし、このソリューションは静的メソッドから呼び出すことはできません。したがって、解決策というよりは回避策だと思います。

誰かがこれを解決するためのより良い方法を知っている場合は、フィードバックに感謝します!

于 2010-01-08T20:30:08.603 に答える