我使用带有ListView
的{{1}}从数据库填充带有HTML的Literal
。当我触发PostBack时,对加载的HTML的更改不会反映在Text='<%#Eval("HTMLData")'%>
。
litRowData.Text
已为ViewState
中的ListView
和Literal
启用,我确保只填充ItemTemplate
在ListView
中if(!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并保存当用户单击保存按钮时,它返回数据库。
答案 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
等等。 ,仅限span
,p
,input
和其他一些内容)。因此,如果您的文字不包含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>