Как вызвать GetWebResourceUrl (), когда Page является нулевым? - PullRequest
0 голосов
/ 30 июля 2011

Я создал собственный элемент управления ASP.NET, и он работает нормально, когда я добавляю его вручную (перетаскивание) или по коду в элементы управления в разметке.
В пользовательском элементе управления MsgBox были встроены такие ресурсы, как JavaScript, CSS и изображения, и возникла проблема, когда я попытался отобразить элемент управления в классе, чтобы вернуть его HTML-код, экземпляр страницы имеет значение 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); * +1019 *

Ответы [ 2 ]

3 голосов
/ 30 июля 2011

Я создал собственный элемент управления ASP.NET ... Я пытаюсь использовать элемент управления в универсальном обработчике (ashx) ... а не на странице или пользовательском элементе управления.

A Page является обработчиком.Вы хотите использовать удобство, предоставляемое классом Page, но не хотите наследовать от Page.Тонкости Page, такие как ClientScript, предполагают Page, из которого можно получить различную информацию.

Вы можете предоставить фиктивный объект Page для вашего элемента управления, установив свойство Page вашего пользовательского Control:

this.Page = new Page();

... тогда вам нужно будет установитьразличные свойства (при условии, что они public), ожидаемые по ClientScriptManager.GetWebResourceUrl():

this.Page.Foo = "bar"; 

, тогда вы можете позвонить:

this.Page.ClientScript.GetWebResourceUrl(...);
0 голосов
/ 30 июля 2011

Если это определенный класс, который наследуется от страницы WebControl, не должен быть нулевым. Если это другой класс, который вы отображаете как часть иерархии, вы можете добавить параметр типа Page и передать ему ссылку на текущую страницу.

...