1

我正在使用 ASP.NET Web 窗体,但我对如何处理状态有疑问。

我正在添加一个新产品,该产品有不同的变化。每个变体都有几个独特的特征,例如:价格、购买价格、变体类型、变体值。

在 UI 中,我希望能够添加变体列表。当我添加了产品的 X 变体和其他信息后,我想提交整个表单,然后开始添加到数据库部分。

用一张图解释:

好的,现在有一个图像。用户为变体添加新名称,单击“添加”,然后将其添加到当前变体 ListBox 控件。单击“当前变体”中的变体时,我可以填写有关变体的信息并保存。

完成所有变体后,我可以提交表单。

在此处输入图像描述

现在,我的问题

如果我使用当前变体的 AutoPostBack 并进行回发,那么由于状态,一切都会被遗忘。使用标准的 ASP.NET Web 表单,我找不到存储这些列表的方法。

我真正需要的是包含对象的 Windows 窗体中的 ListBox。但祝你好运,无状态网络 ;-)

我能想到的解决方案

  • 每次单击时,更改都会保存到提交表单时使用的临时会话中

  • 每次点击,我都可以暂时将内容保存到数据库中

我想要的一种解决方案

一个很好的解决方案是一些 jQuery 魔术,我可以在其中动态创建我需要的所有行,而无需回发。然后当我完成后,我可以迭代所有控件,并将其存储在数据库中。

我想这是一个正常的问题,有人可以发送一个明显的链接,或者告诉我修复它是多么容易!:-)

哦,是的,还有最后一件事,不要让我下地狱,因为我在 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 回答