大师, 所以我试图避免启用EnableViewState ... 您可以看到示例代码中包含1个转发器和2个文本框。我在init页面绑定了文本框。回发后我想从客户端获取更新的数据&保存在数据库中。
Request.Form包含使用自动生成的客户端ID键入的数据,但转发后的转发器有0个项目。所以我的选择似乎有限。 一个。启用viewstate,以便我可以使用Control.Find(...)从转发器中提取数据 湾迭代通过Request.Form并找到我的文本框值......丑陋!!
还有其他建议吗? 最终目标是将数据从数据表呈现到某些文本框,允许用户进行更改然后保存这些更改。如果有一个干净的选择,我想避免使用viewstate。
谢谢或帮助。
ASPX:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Foo.aspx.cs" Inherits="Ads_Foo" EnableViewState="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="head" runat="server">
<title>Foo</title>
</head>
<body>
<form id="form" runat="server">
<asp:Repeater ID="repImport" runat="server" >
<HeaderTemplate></HeaderTemplate>
<ItemTemplate>
<asp:TextBox ID="lit1" runat="server" Text='<%# Eval("id") %>'/>
<asp:TextBox ID="lit2" runat="server" Text='<%# Eval("data") %>'/>
</ItemTemplate>
</asp:Repeater>
<asp:Literal ID="litOut" runat="server" text=""/>
<asp:Button ID="btn" runat="server" OnClick="clicked" Text="btn" />
</form>
</body>
</html>
代码背后:
protected void Page_Init(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add("cnt", typeof(int)); //item.ItemID
dt.Columns.Add("data", typeof(string)); //item.ItemID
DataRow row = dt.NewRow();
row["cnt"] = 123;
row["data"] = "Fake Item Id";
dt.Rows.Add(row);
DataRow row2 = dt.NewRow();
row2["cnt"] = 999999;
row2["data"] = "FPPPP";
dt.Rows.Add(row2);
repImport.DataSource = dt;
repImport.DataBind();
}
}
protected void clicked(object sender, EventArgs e)
{
foreach (RepeaterItem item in repImport.Items)
{
TextBox lit1 = (TextBox)item.FindControl("lit1");
TextBox lit2 = (TextBox)item.FindControl("lit2");
litOut.Text += lit1.Text;
}
}
答案 0 :(得分:1)
您可以尝试始终绑定转发器。只需在if(!Page.IsPostBack)
中设置文本框的初始值即可答案 1 :(得分:0)
Atanas或多或少是正确的。转发器需要在缺少viewstate的每个请求上反弹。如果您担心数据源在帖子之间发生变化,则需要将数据表或较小的数据结构存储在某处(viewstate,session)并重新绑定到该数据源。