通过静态方法获取控件的HTML

时间:2011-11-09 13:31:09

标签: asp.net controls server-side

我正在尝试以下方法:

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);

控件的ID是正确的,我似乎需要在获取其中一个控件的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 个答案:

答案 0 :(得分:1)

我解决了这个问题:

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;
}

现在可以通过其他随机.cs文件中的代码调用不同的HTML位:

HtmlBits.ShowHtml("HtmlBit1");

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

然而,HTML位也可以通过AJAX在一些随机的JavaScript文件中获取(这里用jQuery显示):

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

请注意,上面的所有代码只是为了大致了解我的所作所为 它不是即插即用,但如果其他人需要维护一些小的HTML片段并从几个不同的地方获取它们,这绝对有用。
甚至可以通过GetArg方法输入一些要在HTML中显示的参数。

享受:)

答案 1 :(得分:0)

由于您希望在应用中的各个位置重复使用html,我建议您创建一个User Control

ASP.NET Web表单中的每个请求都必须是一个页面(或HttpHandler)。因此,为了通过ajax访问您的控件,您需要将其添加到页面,然后从javascript请求它。

您可以使用jQuery的$.get() method

$.get('path/to/your/page.aspx', function(data) {
  $('.result').html(data);
  alert('Load was performed.');
});