Получить HTML элемента управления через статический метод - PullRequest
0 голосов
/ 09 ноября 2011

Я пытаюсь сделать следующее:

public partial class PopUps : System.Web.UI.Page {

    public string GetContentFromPlaceHolder(string strContentId) {

        HtmlTextWriter writer = new HtmlTextWriter(new System.IO.StringWriter());

        plcPlaceHolderToGet.RenderControl(writer);
        string strHtml = writer.InnerWriter.ToString();
        return strHtml;

    }

    public static string GetContent() {

        PopUps puToUse = new PopUps();
        string strHtml = puToUse.GetContentFromPlaceHolder();
        return strHtml;

    }

}

Однако, когда я запускаю статический метод GetContent с другой страницы, я получаю эту ошибку:

ссылка на объект не установлена ​​для экземпляра объекта

на линии

plcPlaceHolderToGet.RenderControl(writer);

Идентификатор элемента управления верен, мне просто кажется, что мне нужно выполнить какое-то создание экземпляров элементов управления на странице, прежде чем я смогу получить HTML-код одного из элементов управления.

Чего мне не хватает?

Внешний вид страницы выглядит следующим образом

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PopUps.aspx.cs" Inherits="PopUps" %>

<asp:PlaceHolder runat="server" id="plcPlaceHolderToGet">

    <div>
        Some more HTML...
    </div>

</asp:PlaceHolder>

<asp:PlaceHolder runat="server" id="plcAnotherPlaceHolder">

    <div>
        Some more HTML...
    </div>

</asp:PlaceHolder>

Я пытаюсь сделать это, чтобы в одном месте хранился весь мой HTML. HTML, который иногда нужно извлекать из другого кода C #, а иногда через AJAX-вызов.

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Я решил это так:

HtmlBits.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="HtmlBits.aspx.cs" Inherits="HtmlBits" %>
<%@ Register TagPrefix="testUC" TagName="PopupContent" Src="~/usercontrols/HtmlBitsContent.ascx" %>
<testUC:PopupContent id="popupMain" runat="server" />

Два единственных метода HtmlBits.aspx.cs:

public static string GetHtml(string strContentId, NameValueCollection args = null) {

    string strHtml = "";

    // Find the requested Placeholder in the usercontrol
    Page pageTemp = new Page();
    HtmlBitsContent popupContentControl = (HtmlBitsContent)pageTemp.LoadControl(Server.MapPath("/usercontrols/HtmlBitsContent.ascx"));
    popupContentControl.ExtraArguments = args;
    PlaceHolder plcHolder = (PlaceHolder)popupContentControl.FindControl("plc" + strContentId);

    // Could the Placeholder be found?
    if (plcHolder != null) {

        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        Html32TextWriter hw = new Html32TextWriter(sw);

        plcHolder.RenderControl(hw);
        strHtml = hw.InnerWriter.ToString();

    }

    return strHtml;

}

public static void ShowHtml(string strContentId, NameValueCollection args = null) {

    string strHtml = GetHtml(strContentId, args);
    HttpContext.Current.Response.Write(strHtml);

}

HtmlBitsContent.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="HtmlBitsContent.ascx.cs" Inherits="HtmlBitsContent" %>

<!-- HtmlBit1 -->
<asp:PlaceHolder runat="server" id="plcHtmlBit1">
    <div>
    Some html
    </div>
</asp:PlaceHolder>


<!-- HtmlBit2 -->
<asp:PlaceHolder runat="server" id="plcHtmlBit2">
    <div>
    Some other html
    </div>
</asp:PlaceHolder>

Бэкэнд HtmlBitsContent.ascx:

public NameValueCollection ExtraArguments = null;

protected void Page_Load(object sender, EventArgs e) {

    string strContentId = Request.Querystring("contentid");

    PlaceHolder plcHolderToGet = (PlaceHolder)this.FindControl("plc" + strContentId);
    string strHtml = "";

    if (plcHolderToGet != null) {

        HtmlTextWriter writer = new HtmlTextWriter(new System.IO.StringWriter());
        plcHolderToGet.RenderControl(writer);
        strHtml = writer.InnerWriter.ToString();

    }
    Response.Write(strHtml);
    Response.End();

}

public string GetArg(string strKey) {

    string strArgumentValue = "";

    strArgumentValue = Request.Querystring(strKey);

    if (ExtraArguments != null) {
        if (ExtraArguments[strKey] != null) {
            strArgumentValue = ExtraArguments[strKey];
        }
    }

    return strArgumentValue;
}

Теперь различные биты HTML можно вызывать с помощью кода в каком-то другом случайном файле .cs:

HtmlBits.ShowHtml("HtmlBit1");

или

string strHtml = HtmlBits.GetHtml("HtmlBit1");

Однако биты HTML можно также получить через AJAX в некотором случайном JavaScript-файле (здесь показано с помощью jQuery):

$.ajax({
    url : '/htmlbits.aspx?contentid=HtmlBit1',
    success : function(responseHtml) {
        $('#containerElement').html(responseHtml);
    }
});

Обратите внимание, что всеПриведенный выше код предназначен только для того, чтобы дать общее представление о том, что я сделал.
Это не plug-and-play, но определенно полезно, если кому-то еще нужно поддерживать небольшие фрагменты HTML-кода и извлекать их из разных мест.
Этодаже возможно ввести некоторые аргументы для отображения в HTML через метод GetArg.

Enjoy:)

0 голосов
/ 09 ноября 2011

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

Каждый запрос в веб-формах ASP.NET должен относиться к странице (или к HttpHandler). Поэтому, чтобы получить доступ к вашему элементу управления через ajax, вам нужно добавить его на страницу, а затем запросить его у javascript.

Вы можете использовать метод jQuery $.get() :

$.get('path/to/your/page.aspx', function(data) {
  $('.result').html(data);
  alert('Load was performed.');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...