Jam*_*Law 8 c# asp.net webforms
是的,我在这里有一些非常特别的东西......
ASP.NET 4页面具有以下属性:
protected QuickShopBag QuickShopBagInstance
{
get { return (QuickShopBag)ViewState["QuickShopBag"]; }
set { ViewState["QuickShopBag"] = value; }
}
Run Code Online (Sandbox Code Playgroud)
在初始Page_Load()in(!Page.IsPostBack)期间,QuickShopBagInstance填充并ViewState保存.
但是,当您在页面上执行回发时,从回发Button_OnClick()事件访问时ViewState为空!
我已经检查了Request.Form,确定该_Viewstate值已存在且已填充.我也通过解析器运行了这个值,它确实包含了预期的数据,页面ViewStateEnabled="true"和新的.NET 4 ViewStateMode="Enabled".
我已经继续覆盖LoadViewState方法以检查它是否正在触发,它似乎不是.
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
}
Run Code Online (Sandbox Code Playgroud)
我真的很遗憾可能是什么问题.有任何想法吗?
首先我错了,有问题的代码不是在Page_Load中,而是在Page_Init中,虽然我没有读过任何说你无法在Init分配给ViewState的内容.
所以我整理了一个非常基本的测试,复制了我遇到的问题......
<form id="form1" runat="server">
<div>
<asp:ListView id="QuickshopListView" runat="server">
<LayoutTemplate>
<asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
</LayoutTemplate>
<ItemTemplate>
<asp:TextBox ID="txtItem" runat="server" Text='<%# Container.DataItem %>' />
<asp:Button ID="btnDelete" runat="server" Text="Delete" OnClick="btnDelete_Click" />
<br />
</ItemTemplate>
</asp:ListView>
<asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" />
</div>
</form>
public partial class Quickshop : System.Web.UI.Page
{
protected QuickShopBag QuickShopBagInstance
{
get { return (QuickShopBag)ViewState["QuickShopBag"]; }
set { ViewState["QuickShopBag"] = value; }
}
protected void Page_Init(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (QuickShopBagInstance == null)
QuickShopBagInstance = new QuickShopBag();
if (!String.IsNullOrEmpty(Request.QueryString.ToString()))
{
string[] items = Server.UrlDecode(Request.QueryString.ToString()).Split(',');
if (items.Length > 0)
{
foreach (string item in items)
{
QuickShopBagInstance.QuickShopItems.Add(item);
}
}
}
}
}
protected void Page_LoadComplete(object sender, EventArgs e)
{
QuickshopListView.DataSource = QuickShopBagInstance.QuickShopItems;
QuickshopListView.DataBind();
}
protected void btnAdd_Click(object sender, EventArgs e)
{
if (QuickShopBagInstance == null)
QuickShopBagInstance = new QuickShopBag();
QuickShopBagInstance.QuickShopItems.Add("add1");
QuickShopBagInstance.QuickShopItems.Add("add2");
QuickShopBagInstance.QuickShopItems.Add("add3");
}
protected void btnDelete_Click(object sender, EventArgs e)
{
Button DeleteButton = (Button)sender;
ListViewDataItem item = (ListViewDataItem)DeleteButton.NamingContainer;
QuickShopBagInstance.QuickShopItems.RemoveAt(item.DisplayIndex);
}
}
[Serializable]
public class QuickShopBag
{
public List<string> QuickShopItems { get; set; }
public QuickShopBag()
{
this.QuickShopItems = new List<string>();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您请求说"/quickshop.aspx?add1,add2,add3",则使用来自qs的数据正确填充ListView,但是当单击删除按钮时会抛出NullReferenceException,因为ViewState没有持久化QuickShopBag对象.
但是,如果您单击"添加"按钮,您可以看到向QuickShopBagInstance(和ViewState)添加相同的值,ListView将正确填充,当您单击"删除"按钮时,它将完美地工作,因为ViewState已被持久化.
现在,如果您将查询字符串位读取更改为Page_InitComplete而不是Page_Init,则它可以完美地运行.所以结论是......
您无法在Init_Complete之前添加到视图!!!!!!!!
我是多么愚蠢,至少是谁写的!
| 归档时间: |
|
| 查看次数: |
16996 次 |
| 最近记录: |