我正在使用ASP.NET Web Forms,我对如何处理状态有疑问。
我正在添加新产品,产品有不同的变化。每种变体都有几个独特的特征,例如:价格,购买价格,变体类型,变异价值。
在用户界面中,我希望能够添加变体列表。当我添加X变体和有关产品的其他信息时,我想提交整个表单,然后开始添加到数据库部分。
用图片说明:
好的,现在有了一张图片。用户为变体添加新名称,单击“添加”,然后将其添加到当前变体ListBox控件。单击“当前变体”中的变体时,我可以填写有关变体的信息,然后保存。
当我完成所有变体后,我可以提交表单。
现在,我的问题
如果我使用Current变量的AutoPostBack并进行回发,那么一切都会因为状态而被遗忘。使用标准的ASP.NET Web表单,我找不到存储这些列表的方法。
我真正需要的是来自Windows Forms的包含对象的ListBox。但是无国界网的好运; - )
我能想到的解决方案
每次点击,更改都会保存到提交表单时使用的临时会话
每次点击,我都可以暂时将内容保存到数据库中
我想要的一种解决方案
一个很好的解决方案是一些jQuery魔术,我可以动态创建我需要的所有行而无需回发。然后,当我完成后,我可以迭代所有控件,并将其存储在数据库中。
我想这是一个正常的问题,有人可以发送明显的链接,或者告诉我修复它有多容易! : - )
哦,是的,最后一件事,不要让我下地狱,因为我还有Web表单中的项目。
答案 0 :(得分: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 ?? "";
}