Как мне остановить HtmlEditorExtender кодирования HTML в обратной передаче?

У меня есть пользовательский элемент управления, который содержит текстовое поле,HtmlEditorExtenderи кнопка. Пользовательский элемент управления загружается на родительскую страницу с помощьюLoadControl(), Всякий раз, когда я нажимаю на кнопку, чтобы опубликовать форму, любой форматированный текст в текстовом поле кодируется, что не должно происходить.

Например, если я загружаю текстовый элемент управления с

<p>test</p>

после того, как я нажму на кнопку, чтобы опубликовать страницу, текст, возвращенный.Text свойство

<p>test</p> 

Если я публикую второй раз, он будет закодирован как:

<p>test</p> 

и так далее.

Я подтвердил, что элемент управления работает нормально (не кодирует 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(); 
    } 
} 
 Dan C07 нояб. 2012 г., 19:40
Я никогда не мог заставить это работать надежно для динамически загружаемых сценариев, поэтому я переместил элемент управления на простую страницу, которая была загружена в iframe. Таким образом, элемент управления был статичным на странице и вел себя правильно. Мне просто нужно было перенести данные туда и обратно между родительской страницей и контрольной страницей.

Ответы на вопрос(4)

        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

Ответ наэтот вопро кажется неплохим решением проблемы. Когда вы получаете текст из редактора, используйтеHtmlDecode чтобы преобразовать его:

    String fixedText = HttpUtility.HtmlDecode(txtBody.Text);

Я также опубликую это в вашем случае с кодексом. (Я полагаю, это ваше.)

 Dan C01 янв. 1970 г., 01:00
Я попробовал это, но, к сожалению, это ненадежно. Во время обратной передачи были случаи, когда это вызывало декодирование, когда ничего не должно происходить. Это неправильно изменило бы текст пользователя и уничтожило бы форматирование.
 Matthew Lowe08 нояб. 2012 г., 20:33
Bummer. В мою пользу, не могли бы вы описать один из случаев?

у меня действительно была возможность проверить это, и твоя проблема была воссоздана. Похоже, что если поместить код главной страницы, который находится в событии «Load», в событие «Init», то он работает просто отлично.

 Dan C13 июн. 2012 г., 08:09
Спасибо за предложение. Однако проблема с этим решением заключается в том, что ViewState недоступен, и на реальном веб-сайте я использую ViewState для хранения информации, чтобы определить, сколько из этих пользовательских элементов управления загрузить на страницу. Мне пришлось переместить LoadControl в Page_PreLoad, но у меня все еще была та же проблема, когда он кодировал текст при обратной передаче.

что теги HTML добавляются на основе инструментов, используемых на панели инструментов. Вы пытались загрузить tb.text с помощью:

"Это проверка"

как против

"<p> Это тест </ p>"

Что касается того, почему это удваивается для вас таким образом, если расширитель добавляет теги с каждым обновлением, то кажется, что они будут (должны) добавляться с каждой итерацией.

... поместите теги "p" вокруг текстового поля в разметку

 Dan C08 июн. 2012 г., 08:03
Элемент управления предназначен для восприятия HTML и возможности его редактирования. Проблема в том, что эта проблема кодирования возникает только тогда, когда я использую LoadControl () для загрузки этого элемента управления. Если я перетаскиваю его на форму напрямую, все работает нормально, а при обратной передаче я получаю HTML-код в незашифрованном виде.

Ваш ответ на вопрос