【问题标题】:Preserving dynamic content on Postback在回发中保留动态内容
【发布时间】:2013-11-27 15:53:26
【问题描述】:

我有一个默认情况下看起来像这样的表:

<table width="650" id="myTable" runat="server">
    <tbody>
        <tr>
            <td class="cellWidth300 bottomBorder topBorder">Column1</td>
            <td class="cellWidth125 leftBorder topBorder bottomBorder textCenter">Column2</td>
            <td class="cellWidth100 leftBorder topBorder bottomBorder textCenter">Column3</td>
            <td class="cellWidth125 leftBorder rightBorder topBorder bottomBorder textRight">Column4</td>
        </tr>
        <tr>
            <td class="cellWidth300"><input type="text" size="29" runat="server"/></td>
            <td class="cellWidth125 leftBorder textCenter"><input type="text" size="9" class="units commas" runat="server"/></td>
            <td class="cellWidth100 leftBorder textCenter"><input type="text" size="8" class="value commas" runat="server"/></td>
            <td class="cellWidth125 leftBorder rightBorder textRight"><input type="text" size="11" readonly="readonly" tabindex="-1" class="totalA1 autoTotal" runat="server"/>&nbsp;</td>
        </tr>
        <tr>
            <td class="cellWidth300"><input id="Text2" type="text" size="29" runat="server"/></td>
            <td class="cellWidth125 leftBorder textCenter"><inputtype="text" size="9" class="units commas" runat="server"/></td>
            <td class="cellWidth100 leftBorder textCenter"><input  type="text" size="8" class="value commas" runat="server"/></td>
            <td class="cellWidth125 leftBorder rightBorder textRight"><input type="text" size="11" readonly="readonly" tabindex="-1" class="totalA1 autoTotal" runat="server"/>&nbsp;</td>
        </tr>
        <tr>
            <td class="cellWidth300"><input  type="text" size="29" runat="server"/></td>
            <td class="cellWidth125 leftBorder textCenter"><input type="text" size="9" class="units commas" runat="server"/></td>
            <td class="cellWidth100 leftBorder textCenter"><input type="text" size="8" class="value commas" runat="server"/></td>
            <td class="cellWidth125 leftBorder rightBorder textRight"><input type="text" size="11" readonly="readonly" tabindex="-1" class="totalA1 autoTotal" runat="server" />&nbsp;</td>
        </tr>
    </tbody>
</table>

我有一大块 jquery,每次你在最后一行输入内容时都会生成一个新行。它看起来像这样:

var _addRow ='<tr>' +
'<td width="300"><input type="text" size="29" runat="server" ></td>' +
'<td width="125" class="leftBorder textCenter"><input type="text" size="9" class="units commas" runat="server" /></td>' +
'<td width="100" class="leftBorder textCenter"><input type="text" size="8" class="value commas" runat="server" /></td>' +
'<td width="125" class="leftBorder rightBorder textRight"><input type="text" size="11" readonly="readonly" tabindex="-1" class="totalA1 autoTotal" runat="server" />&nbsp;</td>' +
'</tr>';

function initialize() {
$(document).on('keypress', '#myTable tr:last input', AddRowToMyTable);
}

function AddRowToMyTable() {
$('#myTable tr:last').after(_addRow);
}

这一切都非常棒。

现在,我做了几件需要回发的事情。其中一个是我以 XML 格式保存表中的数据,另一个是我可以从表中的数据创建 PDF。但是,每次我回发时,它都会在数据到达那里之前丢失所有动态生成的数据。也就是说,如果我用所有数据编写一个 XML 文件,那么第三行(非动态生成的最后一行)之后的任何内容都不会出现。

奇怪的是,有一段时间我让这一切都在工作。当时,我以为我保存了数据并立即重新加载以恢复我的表,但这不再起作用,我不知道为什么。

我的第一个主要问题是:如果我回发到服务器,不应该发送动态行中的所有数据吗?也就是说,如果我有第6行的数据,即使回发完成后会丢失,不应该在被清除之前发送到服务器吗?我的保存算法是这样的:

private void WriteMyTableToXML()
{
    HtmlInputText tContent;
    HtmlTableRow tRow;

    int i = 1; //First row is headers, which we don't want.

    _Writer.WriteStartElement("MyTable");

    while (i < tblCropsAndFeed.Rows.Count - 1) // last row should always be blank.  We can skip it
    {
        tRow = tblCropsAndFeed.Rows[i];

        _Writer.WriteStartElement("Entry");

        string tInputBox0 = tRow.Cells[0].Controls[0].ClientID;
        tContent = (HtmlInputText)tRow.FindControl(tInputBox0);
        _Writer.WriteStartElement("name");
        _Writer.WriteString(tContent.Value);
        _Writer.WriteEndElement();

        string tInputBox1 = tRow.Cells[1].Controls[0].ClientID;
        tContent = (HtmlInputText)tRow.FindControl(tInputBox1);
        _Writer.WriteStartElement("units");
        _Writer.WriteString(tContent.Value);
        _Writer.WriteEndElement();

        string tInputBox2 = tRow.Cells[2].Controls[0].ClientID;
        tContent = (HtmlInputText)tRow.FindControl(tInputBox2);
        _Writer.WriteStartElement("value");
        _Writer.WriteString(tContent.Value);
        _Writer.WriteEndElement();

        _Writer.WriteEndElement();

        i++;
    }

    _Writer.WriteEndElement();
}

其次,有没有办法实际上只是保留页面的状态。不存在这样的东西吗?

If(IsPostBack)
    {
    DontResetThePage();
    }

【问题讨论】:

  • 您是加载任何初始数据还是只是没有绑定的纯 html 和 .NET 控件?
  • 它只是普通的html和.NET控件,没有绑定
  • 你每次都写入同一个xml文件吗?就像您不断覆盖或附加数据一样?
  • 该程序允许您为其命名,因此用户可以选择创建一个新的或覆盖现有的。
  • 你以前用过gridview控件吗?在代码隐藏中绑定?

标签: c# javascript jquery .net postback


【解决方案1】:

所以我相信这里最好的选择是使用带有服务器端绑定的 ASP GridView。当您编辑或添加行到 gridview 时,它将使用您从创建的 XML 文件提供的数据在回发时自动重建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多