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

当Page为空时如何调用GetWebResourceUrl()

我构建了一个自定义ASP。. NET控制…我试图在通用处理程序(ashx)中使用控制…不在页面或用户控件中

Page 处理程序。您希望使用Page类提供的便利,但又不希望继承PagePage的优点,如ClientScript,期望Page从中获得各种信息。

您可以通过设置自定义ControlPage属性来为控件提供一个虚拟的Page对象:

this.Page = new Page();

…然后你需要设置ClientScriptManager.GetWebResourceUrl():

期望的各种属性(假设它们是public)。
this.Page.Foo = "bar"; 

则可以调用:

this.Page.ClientScript.GetWebResourceUrl(...);

如果这是从WebControl页面继承的特定类,则不应该为空。如果它是作为层次结构的一部分呈现的另一个类,您可以添加一个Page类型的参数,并将当前页面的引用传递给它。

相关文章:
  • 没有找到相关文章