1

ASP.NET Webフォームを使用していますが、状態の処理方法に問題があります。

新商品を追加していますが、バリエーションが異なります。各バリエーションには、たとえば、価格、購入価格、variation_type、variation_valueなどのいくつかの固有の特性があります。

UIで、バリエーションのリストを追加できるようにしたいと思います。製品に関するXバリエーションやその他の情報を追加したら、フォーム全体を送信してから、データベースへの追加の部分を開始します。

画像で説明:

さて、画像を追加しました。ユーザーがバリエーションの新しい名前を追加し、[追加]をクリックすると、現在のバリエーションのListBoxコントロールに追加されます。「現在のバリエーション」のバリエーションをクリックすると、バリエーションに関する情報を入力して保存できます。

すべてのバリエーションが完了したら、フォームを送信できます。

ここに画像の説明を入力してください

今、私の問題

現在のバリエーションのAutoPostBackを使用してポストバックを作成すると、状態が原因ですべてが忘れられます。標準のASP.NETWebフォームを使用すると、これらのリストを保存する方法が見つかりません。

私が本当に必要としているのは、オブジェクトを含むWindowsフォームのリストボックスです。しかし、ステートレスWebで頑張ってください;-)

私が考えることができる解決策

  • クリックするたびに、変更は一時的なセッションに保存され、フォームの送信時に使用されます

  • クリックするたびに、一時的にデータベースにデータを保存できます

私が欲しい解決策の一種

優れたソリューションは、ポストバックなしで必要なすべての行を動的に作成できるjQueryマジックです。その後、完了したら、すべてのコントロールを繰り返してデータベースに保存できます。

これは正常な問題だと思います。誰かが明らかなものへのリンクを送信したり、修正がいかに簡単かを教えてくれたりする可能性があります。:-)

そうそう、最後にもう1つ、私はまだWebフォームにプロジェクトを持っているので、私を地獄に行かせないでください。

4

1 に答える 1

1

これは間違いなく、ViewStateを使用する必要があると私が感じる場所です。通常、私はWebフォームでViewStateを使用することに反対します。ただし、この「ステートフル」操作が必要な場所にいます。

次のようなフォーム要素を含むASPXの場合:

  New Variation:
  <asp:TextBox runat="server" ID="newName"></asp:TextBox>
  <br />
  <asp:Button runat="server" ID="addName" Text="Add Variant" OnClick="addName_Click" />

  <br />
  <br />
  Current Variations:<br />
  <asp:ListBox runat="server" ID="listOfVariations" Width="200px" 
       AutoPostBack="true" 
       OnSelectedIndexChanged="listOfVariations_SelectedIndexChanged">
  </asp:ListBox>
  <br />
  Feature 1:<br />
  <asp:TextBox runat="server" ID="feature"></asp:TextBox>
  <br />
  <asp:Button runat="server" ID="submit" Text="Add Variation" />

次に、ページの読み込みの間に記憶されるようにデータをViewStateに移動するコードビハインドを記述できます。

    protected void addName_Click(object sender, EventArgs e)
    {
    listOfVariations.Items.Add(newName.Text);
    ViewState.Add("item_" + newName.Text, new VariantObject{ Name = newName.Text });
    newName.Text = "";

    }

  [Serializable]
  public class VariantObject
  {

    public string Name { get; set; }
    public string Feature1 { get; set; }

  }

  protected void listOfVariations_SelectedIndexChanged(object sender, EventArgs e)
  {

    var v = ViewState["item_" + listOfVariations.SelectedValue] as VariantObject;
    feature.Text = v.Feature1 ?? "";

  }
于 2013-03-25T17:27:26.723 に答える