当Page为null时如何调用GetWebResourceUrl()?

时间:2011-07-30 11:04:50

标签: c# .net asp.net custom-controls

我构建了自定义ASP.NET控件,当我手动添加它(拖放)或通过代码添加到标记中的控件时它工作正常。
自定义控件MsgBox有嵌入的JavaScript,CSS和图像等资源,当我尝试在类中渲染控件以返回其HTML代码时出现问题,Page实例为null并且“GetWebResourceUrl”需要它:

Page.ClientScript.GetWebResourceUrl(.....)  

有没有办法获得资源?这是我的渲染代码:

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

2 个答案:

答案 0 :(得分:3)

  

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

Page 处理程序。您希望使用Page类提供的便利,但不希望继承PagePage的细节,例如ClientScript,期望从Page获取各种信息。

您可以通过设置自定义Page的{​​{1}}属性为您的控件提供虚拟Page对象:

Control

...然后你需要设置this.Page = new Page(); 期望的各种属性(假设它们是public):

ClientScriptManager.GetWebResourceUrl()

然后你可以打电话:

this.Page.Foo = "bar"; 

答案 1 :(得分:0)

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