ASP(.NET 4)ViewState启用了Literal控件,不保留对PostBack上HTML内容的更改

时间:2013-09-12 16:32:04

标签: c# html asp.net listview

我使用带有ListView的{​​{1}}从数据库填充带有HTML的Literal。当我触发PostBack时,对加载的HTML的更改不会反映在Text='<%#Eval("HTMLData")'%>

中 {p> litRowData.Text已为ViewState中的ListViewLiteral启用,我确保只填充ItemTemplateListViewif(!IsPostBack)为真时,使用数据库中的初始值。

Page_Load

我需要能够捕获已加载的HTML控件内容的更改。由于这个HTML来自数据库表,我不能只在<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> 内使用ASP控件。任何人都可以看到我缺少的东西,或建议另一种方法来做到这一点吗?

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

2 个答案:

答案 0 :(得分: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对象的属性,并且__VIEWSTATE隐藏字段被反序列化为与html值不对应的对象的所有属性{ {1}}标签。例如,如果input具有与之关联的Page.bob属性,则可能会将其存储在DateTime中。

页面标记中的ASP.NET __VIEWSTATE标记将完全按原样打印到浏览器中,这意味着如果您将Literal作为其值,那么它将在{{1}中显示}} 标签。但是,在普通的HTML世界中,发布后的<span>bob</span>代码只会​​包含某些表单元素的值(也就是说,不是每个<form><form>div等等。 ,仅限spanpinput和其他一些内容)。因此,如果您的文字不包含select,那么它甚至不会被发回,意味着textarea将用于将input的{​​{1}}属性恢复为它的初始状态。

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

答案 1 :(得分:0)

这个答案建立在前一个答案之上,因为你有一个正确回发编辑值的.NET TextBox控件。在它下面,你可以添加到后面的代码:

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>