none
При рендеринге в строку событие Page_Load этого контрола не происходит RRS feed

  • Вопрос

  • В свой пользовательский контрол добавил логику.
    Но при рендеринге в строку событие Page_Load этого контрола не происходит.
    Как можно решить эту проблему?

    Это мой контрол:
    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="uc_calendar.ascx.cs" Inherits="uc_calendar" %>
    
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    Это логика контрола (управление в Page_Load не передается). Возможно, надо использовать другое событие?
    public partial class uc_calendar : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = "Отработано";
        }
    }
    Этот класс загружает контрол и рендерит его в строку:
    public class PageWoVerify : System.Web.UI.Page
    {
        public override void VerifyRenderingInServerForm(Control control)
        { /* Do nothing */ }
    
        public override bool EnableEventValidation
        {
            get { return false; }
            set { /* Do nothing */ }
        }
        
        public string RenderToString(string controlPath)
        {
            UserControl ctrl = (UserControl)LoadControl(controlPath);
            using (TextWriter myTextWriter = new StringWriter())
            {
                using (HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter))
                {
                    ctrl.RenderControl(myWriter);
                    return myTextWriter.ToString();
                }
            }
        }
    }
    Здесь я создаю вышеуказанный класс, передаю ему путь к контролу и вывожу результат.
        protected void Button2_Click(object sender, EventArgs e)
        {
            PageWoVerify rc = new PageWoVerify();
            string cont = rc.RenderToString("~/uc_calendar.ascx");
            TextBox1.Text = cont;
        }

    HTML вывод - "<span id="Label1">Label</span>". Текст записи не изменился.

    • Разделено I.Vorontsov 28 октября 2009 г. 14:12 1 вопрос - 1 топик
    27 октября 2009 г. 21:48

Ответы

  • Вам не нужно использовать функцию RenderToString. А просто добавить контрол с помощью выше приведенного кода.
    • Предложено в качестве ответа I.Vorontsov 2 ноября 2009 г. 13:46
    • Помечено в качестве ответа Moiseev Stanislav 5 ноября 2009 г. 13:25
    30 октября 2009 г. 11:11

Все ответы

  • Да скорее всего нужно использовать другое событие, попробуйте Page_Init...
    28 октября 2009 г. 14:34
  • Верный способ добавить user control на страницу выглядит так:

    Control control = LoadControl("~/uc_calendar.ascx");
    this.Controls.Add(control);

    Обработчик Page_Load не отработался в календаре, так как вы просто в методе RenderToString создали экземпляр класса вашего user control, а это не запускает цепочку событий в нем.
    28 октября 2009 г. 21:30
  • Верный способ добавить user control на страницу выглядит так:

    Control control = LoadControl("~/uc_calendar.ascx");
    this.Controls.Add(control);
    Насколько я правильно Вас понял, изменил код следующим образом ...

        public string RenderToString(string controlPath)
        {
            UserControl ctrl = (UserControl)LoadControl(controlPath);
            this.Controls.Add(ctrl);
            using (TextWriter myTextWriter = new StringWriter())
            {
                using (HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter))
                {
                    ctrl.RenderControl(myWriter);
                    return myTextWriter.ToString();
                }
            }
        }

    Html Вывод через класс PageWoVerify:
    <span id="ctl00_Label1">Label</span>

    Ни Load, ни Init не происходит, если контрол добавляю в класс наследник от Page (PageWoVerify, в моем случае). В контексте текущей веб-формы работает.
    Но как можно решить эту задачу не через текущую веб-форму? В частности я хочу отправить клиенту счет в виде html вложения. Для этого мне надо отрендерить таблицу, которую формирует мой user-контрол. Логика, собирающая html код счета, никак не связана с текущей страницей.


    29 октября 2009 г. 19:08
  • Вам не нужно использовать функцию RenderToString. А просто добавить контрол с помощью выше приведенного кода.
    • Предложено в качестве ответа I.Vorontsov 2 ноября 2009 г. 13:46
    • Помечено в качестве ответа Moiseev Stanislav 5 ноября 2009 г. 13:25
    30 октября 2009 г. 11:11