Получение данных из повторителя с помощью EnableViewState = false ... Как / Альтернатива? - PullRequest
1 голос
/ 19 сентября 2010

Gurus, Поэтому я пытаюсь избежать включения EnableViewState ... Пример кода, как вы можете видеть, имеет 1 повторитель и 2 текстовых поля внутри. Я связываю текстовые поля на странице init. После обратной передачи я хочу получить обновленные данные от клиента и сохранить их в БД.

Request.Form содержит данные, введенные автоматически сгенерированными идентификаторами клиента, но ретранслятор имеет 0 элементов после обратной передачи. Так что мои возможности кажутся ограниченными. а. Включите viewstate, чтобы я мог извлечь данные из репитера, используя Control.Find (...) б. переберите Request.Form и найдите мои значения в текстовом поле ... безобразно !!

Есть еще предложения? в конечном итоге цель состоит в том, чтобы преобразовать данные из данных в некоторые текстовые поля, позволить пользователю вносить изменения, а затем сохранять эти изменения. Я хотел бы избежать просмотра состояния, если есть чистая альтернатива ..

Спасибо или помощь.

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 ]

1 голос
/ 19 сентября 2010

Вы можете всегда пытаться связать повторитель.Просто установите начальные значения текстовых полей в if (! Page.IsPostBack)

0 голосов
/ 01 мая 2012

Атанас более или менее правильный. Повторитель должен быть отскочил на каждый запрос в отсутствие viewstate. Если вас беспокоит смена источника данных между постами, вам нужно где-то сохранить свою структуру данных или меньшую структуру данных (viewstate, session) и привязать ее к ней.

...