【发布时间】:2015-10-02 05:00:13
【问题描述】:
我正在将要包含在常规 Web 表单 (.aspx) 中的 Web 用户控件 (.ascx) 内部工作,但我需要能够从用户控件。在我的 Coldfusion 日子里,
【问题讨论】:
-
下面的答案似乎都依赖于具有 runat="server" 属性的标头,否则 Page.Header 为空。
我正在将要包含在常规 Web 表单 (.aspx) 中的 Web 用户控件 (.ascx) 内部工作,但我需要能够从用户控件。在我的 Coldfusion 日子里,
【问题讨论】:
要添加 HTML 标记,您可以执行以下操作:
在您的 UserControl 代码中,您可以访问 Page.Header,它本身就是一个控件。然后,您可以向该控件添加新控件:
HtmlGenericControl newControl = new HtmlGenericControl("someTag");
newControl.Attributes["someAttr"] = "some value";
Page.Header.Controls.Add(newControl);
要添加脚本标记,您根本不需要访问 head 标记,因为 ASP.NET 在 ClientScriptManager 上有帮助方法为您工作:
以下是一些代码示例,您也可以将其放入用户控件的代码中:
// Register some inline script:
Page.ClientScript.RegisterClientScriptBlock(GetType(), "myAlertScript", "alert('hello!')", true);
// Register a script reference:
Page.ClientScript.RegisterClientScriptInclude(GetType(), "myLibraryScript", "~/Scripts/MyScriptLibrary.js");
【讨论】:
我意识到这是一个老问题,但这是另一个例子。
试试这个:
Page.Header.Controls.Add(
new LiteralControl(
"<script>alert('Literal Added to <Head>.');</script>"
)
);
如果您想在 <head> 的特定索引处添加脚本,您可以使用
AddAt(index, new LiteralControl(...)) 其中索引 0 等于 <head> 的顶部
此外,您需要在 head 标签中添加 runat="server",例如<head id="head1" runat="server">
【讨论】:
this.Page.Header.Controls.Add
通过这样做,您将控件添加到头部。您可以添加任何类型的控件。如果您觉得需要添加简单的文本(或者您想手动编写标签),请查看 LiteralControl 类。
【讨论】:
有一些关于使用 C# 代码修改页眉 here 的指导。在页面加载完成之前执行的任何服务器端代码都应该可以正常工作。
一个简单的例子
HtmlHead head = Page.Header;
HtmlTitle title = new HtmlTitle();
title.Text = "Test Page";
head.Controls.Add(title);
HTMLHead 引用在命名空间中
System.Web.UI.HtmlControls
重写自定义控件的 Load() 方法以在服务器端加载父 .aspx 页面时将所需的控件或引用添加到页眉中。
【讨论】:
我有一个简单的解决方案。基于页面的 url(作为键)创建一个运行时内存缓存,其中包含关于 y 的 x 信息(可以是文件引用、脚本文本或生成 JavaScript 的类),并将其数据序列化为 JSON。 Newtonsoft 对任何类的实例都有帮助。事实上,您可以使用它的输出来根据给定的输入初始化一个类的任何新实例。在某种程度上,这意味着您可以自动实例化任何特定类的实例,而不管该实例处于何种用户控制之下。最后,您将创建一个简单的 Web 表单作为脚本参考和最终端点。它提取 JavaScript(或其他什么)并吐出您需要的客户端代码作为 head 标记内的脚本引用。
【讨论】: