0

我正在使用withListView从数据库中填充 HTML 。当我触发 PostBack 时,对已加载 HTML 的更改不会反映在.LiteralText='<%#Eval("HTMLData")'%>litRowData.Text

ViewState已为页面、ListViewLiteral中的 启用ItemTemplate,并且我确保仅在中为真ListView时才使用数据库中的初始值填充。if(!IsPostBack)Page_Load

<asp:ListView ID="lvForm" runat="server"
            DataKeyNames="RowID" ItemPlaceholderID="phRow"
            EnableViewState="true">
    <LayoutTemplate>
        <asp:PlaceHolder ID="phRow" runat="server" />
    </LayoutTemplate>
    <ItemTemplate>
        <asp:Literal ID="litRowData" runat="server" Text='<%#Eval("HTMLData")%>'
        EnableViewState="true"></asp:Literal>
    </ItemTemplate>
</asp:ListView>

我需要能够捕获对加载的 HTML 控件内容的更改。由于这个 HTML 来自数据库表,我不能只在ItemTemplate. 任何人都可以看到我缺少的东西,或者建议另一种方法来做到这一点?

编辑:为了澄清一点,我正在尝试从数据库动态加载表单输入元素,将它们呈现为页面上的 HTML 控件,允许用户通过输入文本或选择选项来修改其内容,然后捕获修改后的 HTML并在用户单击保存按钮时将其保存回数据库。

4

2 回答 2

1

.NET 中回发的工作方式实际上是对 HTML 表单更基本概念的包装。HTML 表单的一个基本示例是:

<html>
<body>
<form action="" method="POST">
    <input type="text" value="type here" />
    <input type="submit" value="go" />
</form>
</body>
</html>

粗略地说,.NET 抽象添加的是:

<html>
<body>
<form action="" method="POST">
    <input type="hidden" name="__VIEWSTATE" value="string-encoded-value" />
    <input type="text" name="bob" value="type here" />
    <input type="submit" value="go" />
</form>
</body>
</html>

因此,在回发到您的页面时,所有具有名称的输入元素都将映射回您的 Page 对象的属性,并且隐藏字段被反序列化为与 html标记__VIEWSTATE值不对应的对象的所有属性。input例如,如果Page.bob有一个DateTime与之关联的属性,它可能会存储在其中__VIEWSTATE

页面标记中的ASP.NETLiteral标记将完全按原样打印到浏览器中,这意味着如果您将<span>bob</span>其作为其值,那么这就是它在<form>标记中的显示方式。但是,在纯 HTML 世界中,<form>发布时的标签将仅包含某些表单元素的值(也就是不是每个div,spanp都会被回发,只有input,selecttextarea其他一些元素)。因此,如果您的文字不包含 aninput那么它甚至不会被回发,这意味着__VIEWSTATE将用于将 back 的Value属性Literal恢复到其初始状态。

要解决此问题,您可能不想将 html 粘贴到 a 中Literal,因为即使这样做也不清楚它是否会与页面的正确属性相关联。相反,请尝试直接由 ASP.NET webforms 代码TextBox编写为元素的元素或其他内容。input或者,如果您不需要保留数据,请尝试使用 javascript 来允许修改 div 中的纯文本。

于 2013-09-12T18:35:38.573 回答
0

TextBox由于您拥有一个正确回发编辑值的.NET 控件,因此此答案建立在前一个答案的基础上。在它的正下方,您可以添加到后面的代码:

protected void Page_Load(object sender, EventArgs e)
{
    litRowData.Attributes.Add("onKeyUp", "WriteText(this.value)");
}

html:

<ItemTemplate>
    <asp:TextBox ID="litRowData" runat="server"  />
</ItemTemplate>

<div id="yourPreview"></div>
<script type="text/javascript">
   function WriteText(val){
       document.getElementById("yourPreview").innerHTML=val
    }
</script>
于 2013-09-12T21:08:19.357 回答