我构建了自定义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);
答案 0 :(得分:3)
我构建了一个自定义的ASP.NET控件... 我想在通用处理程序(ashx)中使用控件...而不是在页面或用户控件中。
Page
是处理程序。您希望使用Page类提供的便利,但不希望继承Page
。 Page
的细节,例如ClientScript
,期望从Page
获取各种信息。
您可以通过设置自定义Page
的{{1}}属性为您的控件提供虚拟Page
对象:
Control
...然后你需要设置this.Page = new Page();
期望的各种属性(假设它们是public
):
ClientScriptManager.GetWebResourceUrl()
然后你可以打电话:
this.Page.Foo = "bar";
答案 1 :(得分:0)
如果这是从WebControl页面继承的特定类,则不应为null。如果您作为层次结构的一部分呈现的另一个类,则可以添加类型为Page的参数,并将当前页面的引用传递给它。