Я решил это так:
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:)