我有一个用户控件,其中包含一个文本框,一个HtmlEditorExtender
和一个按钮。使用LoadControl()
将用户控件加载到父页面中。每当我点击按钮发布表单时,文本框中的任何格式化文本都会被编码,这不是应该发生的事情。
例如,如果我使用
加载文本控件<p>test</p>
点击按钮发布页面后,.Text
属性返回的文本为
&lt;p&gt;test&lt;/p&gt;
如果我第二次发布,则进一步编码为:
&amp;lt;p&amp;gt;test&amp;lt;/p&amp;gt;
等等。
如果我在设计时将用户控件添加到页面,我确认控件工作正常(不编码HTML)。只有在我使用LoadControl()
加载时才会出现此问题。
我花了好几天时间试图解决这个问题,但是我无法判断我是否做错了什么,控件是否与此方案不兼容,或者是否有可靠的解决方法。
这是一个简单的例子:
用户控制:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestDynamicRichTextControl.ascx.cs" Inherits="Sample.forms.TestDynamicRichTextControl" %>
<asp:TextBox ID="txtBody" runat="server" Columns="80" Rows="15" TextMode="MultiLine"></asp:TextBox>
<ajaxToolkit:HtmlEditorExtender ID="heeBody" runat="server" TargetControlID="txtBody">
<Toolbar>
<ajaxToolkit:Bold />
<ajaxToolkit:Italic />
<ajaxToolkit:Underline />
</Toolbar>
</ajaxToolkit:HtmlEditorExtender>
<br />
<asp:Button ID="btnTestPartialPostback" runat="server" Text="Test Partial Postback" onclick="btnTestPartialPostback_Click" />
<asp:Label ID="lblResult" runat="server"></asp:Label>
用户控制代码(BaseUserControl
扩展System.Web.UI.UserControl
并声明Initialize()
):
public partial class TestDynamicRichTextControl : BaseUserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
public override void Initialize()
{
txtBody.Text = "<p>test</p>";
}
protected void btnTestPartialPostback_Click(object sender, EventArgs e)
{
lblResult.Text = DateTime.Now.ToString();
}
}
主页面包含此占位符:
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
主页的代码:
public partial class TestDynamicControl : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
PlaceHolder1.Controls.Clear();
BaseUserControl formUc = (BaseUserControl)this.LoadControl("forms/TestDynamicRichTextControl.ascx");
PlaceHolder1.Controls.Add(formUc);
if (!IsPostBack)
formUc.Initialize();
}
}
答案 0 :(得分:1)
对this question的回应似乎是一个不错的解决方法。当您从编辑器中获取文本时,请使用HtmlDecode
进行转换:
String fixedText = HttpUtility.HtmlDecode(txtBody.Text);
我会继续在你的codeplex案例中发布这个。 (我认为这是你的。)
答案 1 :(得分:0)
我对HTML扩展程序的理解是,HTML标记是根据工具栏上使用的工具添加的。您是否尝试使用以下命令加载tb.text:
“这是一个测试”
而不是
“&lt; p&gt;这是一个测试&lt; / p&gt;”
至于为什么它会像你那样加倍,如果扩展器在每次更新时添加标签,那么它们似乎(应该)在每次迭代时都会被添加。
...在标记文本框中放置“p”标记
答案 2 :(得分:0)
无论如何,我实际上有机会测试这个,你的问题被重新创建了。看起来好像将“加载”事件中的主页代码放入“Init”事件中就可以正常工作了。
答案 3 :(得分:-1)
我能够像这样解决这个问题:
Literal lit = new Literal();
lit.Mode = LiteralMode.PassThrough;
lit.Text = HttpUtility.HtmlDecode(HTMLTExt);
TextBox1.Text = lit.Text; // The text box which HTMLEditorExtender is attached to