我正在尝试以下方法:
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调用。
答案 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.');
});