【问题标题】:How call GetWebResourceUrl() when Page is null ?当 Page 为 null 时如何调用 GetWebResourceUrl() ?
【发布时间】:2011-07-31 01:50:49
【问题描述】:

我构建了自定义 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);

【问题讨论】:

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


    【解决方案1】:

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

    Page 一个处理程序。您想使用 Page 类提供的便利,但又不想从 Page 继承。 Page 的细节,例如ClientScript,需要一个Page 来获取各种信息。

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

    this.Page = new Page();
    

    ...那么您将需要设置ClientScriptManager.GetWebResourceUrl() 所期望的各种属性(假设它们是public):

    this.Page.Foo = "bar"; 
    

    然后你可以调用:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 它继承自 WebControl..但是当我尝试在类中创建控件的实例并将其呈现以返回 html 代码时出现问题...我正在考虑按照你说的做如果我找不到更好的解决方案..
      猜你喜欢
      • 2011-04-16
      • 2014-05-11
      • 2014-09-08
      • 2021-06-14
      • 2021-06-27
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      相关资源
      最近更新 更多