当Page为空时如何调用GetWebResourceUrl()
本文关键字:GetWebResourceUrl 调用 何调用 Page | 更新日期: 2023-09-27 18:03:55
我构建了自定义ASP。. NET控件,当我手动(拖放)或通过代码将其添加到标记中的控件时,它工作得很好。
自定义控件MsgBox中嵌入了JavaScript, CSS和图像等资源,当我试图在类中渲染控件以返回其HTML代码时,出现了问题,Page实例为空,"GetWebResourceUrl"需要它:
Page.ClientScript.GetWebResourceUrl(.....)
是否有办法获得资源url ?这是我的渲染代码:
protected override void RenderContents(HtmlTextWriter writer)
{
using (PlaceHolder plh = new PlaceHolder())
{
if (Page != null)
{
if (DesignMode || Page.Header == null)
RegisterCSSInclude(plh);
}
HtmlGenericControl container = new HtmlGenericControl("div");
container.EnableViewState = false;
container.InnerHtml = "Control html code";
plh.Controls.Add(container);
plh.RenderControl(writer);
}
}
RegisterCSSInclude是注册css文件的方法:
private void RegisterCSSInclude(Control target)
{
// CSS
bool linkIncluded = false;
foreach (Control c in target.Controls)
{
if (c.ID == "MsgBxStyle")
{
linkIncluded = true;
}
}
if (!linkIncluded)
{
HtmlGenericControl globalCsslink = new HtmlGenericControl("link");
globalCsslink.ID = "MsgBxGStyle";
globalCsslink.Attributes.Add("href", Page.ClientScript.GetWebResourceUrl(typeof(MessageBoxCtrl), "MessageBox.MsgBxStyles.WeDevMsgBox.css"));
globalCsslink.Attributes.Add("type", "text/css");
globalCsslink.Attributes.Add("rel", "stylesheet");
globalCsslink.EnableViewState = false;
target.Controls.Add(globalCsslink);
HtmlGenericControl csslink = new HtmlGenericControl("link");
csslink.ID = "MsgBxStyle";
csslink.Attributes.Add("href", Page.ClientScript.GetWebResourceUrl(typeof(MessageBoxCtrl), "MessageBox.MsgBxStyles." + Style.ToString().ToLower() + ".css"));
csslink.Attributes.Add("type", "text/css");
csslink.Attributes.Add("rel", "stylesheet");
csslink.EnableViewState = false;
target.Controls.Add(csslink);
}
}
更新:
PS:我试图在通用处理程序(ashx)中使用控件,我调用ShowMsgBox方法,这是一个类中的方法,而不是在页面或用户控件中。
ShowMsgBox方法应该创建一个MsgBox控件的实例并呈现它,然后将html代码返回给ashx类:
var htmlCode = MyClass.ShowMsgBox("myMsg");
context.Response.write (htmlCode);
我构建了一个自定义ASP。. NET控制…我试图在通用处理程序(ashx)中使用控制…不在页面或用户控件中
Page
是处理程序。您希望使用Page类提供的便利,但又不希望继承Page
。Page
的优点,如ClientScript
,期望Page
从中获得各种信息。
您可以通过设置自定义Control
的Page
属性来为控件提供一个虚拟的Page
对象:
this.Page = new Page();
…然后你需要设置ClientScriptManager.GetWebResourceUrl()
:
public
)。this.Page.Foo = "bar";
则可以调用:
this.Page.ClientScript.GetWebResourceUrl(...);
如果这是从WebControl页面继承的特定类,则不应该为空。如果它是作为层次结构的一部分呈现的另一个类,您可以添加一个Page类型的参数,并将当前页面的引用传递给它。