使用EnableViewState = false从Repeater中提取数据...如何/替代?

时间:2010-09-19 04:53:15

标签: c# .net asp.net visual-studio viewstate

大师, 所以我试图避免启用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;
        }
    }

2 个答案:

答案 0 :(得分:1)

您可以尝试始终绑定转发器。只需在if(!Page.IsPostBack)

中设置文本框的初始值即可

答案 1 :(得分:0)

Atanas或多或少是正确的。转发器需要在缺少viewstate的每个请求上反弹。如果您担心数据源在帖子之间发生变化,则需要将数据表或较小的数据结构存储在某处(viewstate,session)并重新绑定到该数据源。