Элементы управления ASP.NET, созданные из XSLT, не отображаются на панели, добавленной в качестве литерального элемента управления - PullRequest
0 голосов
/ 17 февраля 2010

У меня есть следующий код:

   XElement Categories =
                       new XElement("Promotions",
                           from b in db.GetPromotions()
                        select new XElement("Promotion",
                            new XElement ("Category",b.CategoryName),
                               new XElement("Client",b.ClientName),
                               new XElement("ID",b.ID),
                               new XElement("Title",b.Title)));

                    XDocument mydoc = new XDocument();
                    mydoc.Add(Categories);

                    try
                    {
                            // Load the style sheet.
                            XslTransform xslt = new XslTransform();
                            xslt.Load(@"C:\Web\DesktopModules\Promotions\TransList.xslt");

                            // Execute the transform and output the results to a writer.
                            StringWriter sw = new StringWriter();
                            //XsltSettings mysettings = new XsltSettings();
                            XmlWriterSettings mysettings = new XmlWriterSettings();

                            xslt.Transform(mydoc.CreateReader(),null, sw);

                            String mstring = sw.ToString();

Генерирует следующую строку:

<ul id="red" class="treeview-red" xmlns:asp="http://schemas.microsoft.com/ASPNET/20">
  <li><span>Arts &amp; Entertainment</span><ul>
      <li><span>Client 1</span><ul>
          <li><span><asp:LinkButton ID="LinkButton2" runat="server" OnClick="LinkClicked" Text="Get your Free 2" /></span></li>
          <li><span><asp:LinkButton ID="LinkButton4" runat="server" OnClick="LinkClicked" Text="Get your Free 4" /></span></li>
          <li><span><asp:LinkButton ID="LinkButton5" runat="server" OnClick="LinkClicked" Text="Get your Free 5" /></span></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><span>Community &amp; Neighborhood</span><ul>
      <li><span>Client 2</span><ul>
          <li><span><asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkClicked" Text="Get your Free 1" /></span></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><span>Education</span><ul>
      <li><span>Client 3</span><ul>
          <li><span><asp:LinkButton ID="LinkButton3" runat="server" OnClick="LinkClicked" Text="Get Your Free 3" /></span></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><span>Home &amp; Garden</span><ul>
      <li><span>Client 4</span><ul>
          <li><span><asp:LinkButton ID="LinkButton6" runat="server" OnClick="LinkClicked" Text="Get your Free 6" /></span></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

Теперь я беру строку и добавляю ее на панель, которая является частью представления в элементе управления с несколькими окнами:

Panel1.Controls.Add(new LiteralControl(mstring));

Я пытался поиграть с Page.ParseControl, но я не могу заставить его работать прямо на панели, кнопки ссылки не отображаются, даже если в источнике есть текст. Любые предложения приветствуются.

Заранее спасибо

Теперь я попробовал это:

Control myctrl = Page.ParseControl(mstring);         
Panel1.Controls.Add(myctrl);

и я получаю это как один из элементов управления:

a id="dnn_ctr954_ViewPromotions_LinkButton2" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;dnn$ctr954$ViewPromotions$LinkButton2&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))">Get your Free 2</a>

Это не работает так, как ожидалось, dotnetnuke делает какие-то сумасшедшие вещи, используя контроль синтаксического анализа. похоже, что мое событие LinkClicked пропущено.

Ответы [ 3 ]

1 голос
/ 18 февраля 2010

Ну, вот и все, это сработало:

 String mstring = sw.ToString();
 var myctrl = ParseControl(mstring);

      foreach (Control Control in myctrl.Controls)
            {
                 if (Control is LinkButton)
                       {
                            LinkButton lb = (LinkButton)Control;
                            lb.OnClientClick = "LinkClicked";
                       }
                             Panel1.Controls.Add(myctrl);
            }
0 голосов
/ 17 февраля 2010

Код, который вы пишете в aspx-файлах, например

<asp:LinkButton ID="LinkButton1" runat="server">

никогда не заканчивается в конечном HTML!

Скорее эта разметка переводится компилятором ASP.Net в код C # /. Net, который во время выполнения создает элементы управления, которые, в свою очередь, генерируют вывод HTML в соответствии с их состоянием и данными.

Добавление разметки asp в элемент управления Literal приведет только к той же разметке, которую браузер не сможет отобразить, поскольку тег asp: LinkButton не определен в HTML. (Проверьте, выбрав «Просмотр источника» в вашем браузере)

Вы можете попробовать заменить asp: LinkButton (либо в исходном mydoc, либо в xslt) на собственный HTML-тег

0 голосов
/ 17 февраля 2010

Используйте элемент управления ASP.NET XML вместо элемента управления Literal.

Описание управления сервером:

Элемент управления веб-сервера XML используется для отображать содержимое XML документ без форматирования или использования XSL-преобразования. Вы можете опционально укажите таблицу стилей XSLT который форматирует документ XML раньше отображается на XML-сервере контроль. Элемент управления веб-сервера XML принадлежит к Пространство имен System.Web.UI.WebControls. Вы можете добавить элемент управления веб-сервера XML в веб-форму, перетаскивая элемент управления на вкладке Веб-формы панели инструментов.

Элемент управления XML Web Server имеет следующие свойства:

DocumentSource: позволяет указать URL или путь XML документ для отображения в Интернете форма.

TransformSource: позволяет указать URL-адрес файла XSLT, который превращает документ XML в Требуемый формат перед отображением в веб-форме.

Документ: позволяет указать ссылка на объект Класс XMLDocument. Это свойство доступно только во время выполнения.

Преобразование: позволяет указать ссылка на объект Класс XMLTransform. Это свойство доступно только во время выполнения.

...