【发布时间】:2010-10-06 00:26:07
【问题描述】:
如何以编程方式将 Javascript 文件添加到用户控件?
我希望用户控件是一个完整的包 - 即我不想在使用它的页面上添加与用户控件相关的 javascript,因为我可以在控件本身内部执行它。
既然用户控件中没有Page对象,你会怎么做呢?
【问题讨论】:
标签: asp.net javascript user-controls
如何以编程方式将 Javascript 文件添加到用户控件?
我希望用户控件是一个完整的包 - 即我不想在使用它的页面上添加与用户控件相关的 javascript,因为我可以在控件本身内部执行它。
既然用户控件中没有Page对象,你会怎么做呢?
【问题讨论】:
标签: asp.net javascript user-controls
在control.ascx.cs文件的Page_Load方法中:
LiteralControl jsResource = new LiteralControl();
jsResource.Text = "<script type=\"text/javascript\" src=\"js/mini-template-control.js\"></script>";
Page.Header.Controls.Add(jsResource);
HtmlLink stylesLink = new HtmlLink();
stylesLink.Attributes["rel"] = "stylesheet";
stylesLink.Attributes["type"] = "text/css";
stylesLink.Href = "css/mini-template-control.css";
Page.Header.Controls.Add(stylesLink);
这会将css和Javascript加载到主页的head标签中,只要确保head有runat="server"。
【讨论】:
您可以使用 ClientScriptManager 注册客户端脚本包括。 页面可通过 Control.Page 属性访问。
Page.ClientScript.RegisterClientScriptInclude (
typeof ( MyControl ), "includeme.js", "js/includeme.js" );
编辑:对不起,对于一个完整的“完整包”,它可以使用脚本作为嵌入式资源, 并通过 WebResource.axd 处理程序获取动态 URL。 如果这不被认为是完全完整的,那么我想它可以放在 App_LocalResources 中,但它永远不会只是一个文件, 除非代码和脚本是内联的。
【讨论】:
和gnomixa的响应一样,只是干净了一点:
HtmlGenericControl js = new HtmlGenericControl("script");
js.Attributes["type"] = "text/javascript";
js.Attributes["src"] = "jscript/formfunctions.js";
Page.Header.Controls.Add(js);
来自http://www.aspdotnetfaq.com/Faq/How-to-Programmatically-add-JavaScript-File-to-Asp-Net-page.aspx
【讨论】:
在我的站点中,我将所有需要的脚本和样式放置到 placeHolder
<asp:placeHolder runat="Server" ID="phHead">
<script src="/header/widget/script.js" type="text/javascript"></script>
<link href="/header/widget/style.css" rel="stylesheet" type="text/css" />
</asp:placeHolder>
和
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Page.Header.Controls.Add(phHead)
End Sub
【讨论】:
好问题!
UserControl 应该是一个单独的包,不依赖于 JavaScript 或 CSS 文件。您需要将 JS 和 CSS 文件作为嵌入式资源。右键单击属性并将构建操作设置为嵌入式资源。然后您需要将 JavaScript 和 CSS 文件作为 WebResources 注入。
这是我昨天写的一篇文章,讨论了同样的场景:
http://highoncoding.com/Articles/502_Creating_RadioButton_Validation_Using_Custom_Validator.aspx
【讨论】:
我通常在呈现控件的 HTML 时这样做,并且根据它是库注入还是实例注入,我使用 Items 集合来指定我是否已经在运行期间为这种类型的控件生成了代码使用唯一标识符的当前请求。
大意是:
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
//Check if the Object Script has already been rendered during this request.
if (!Context.Items.Contains("xxx"))
{
//Specify that the Object Script has been rendered during this request.
Context.Items.Add("xxx", string.Empty);
//Write the script to the page via the control
writer.Write([libraryinjection]);
}
//Write the script that instantiates a new instance for this control
writer.Write([instanceinjection]);
}
【讨论】:
如果您的 .CS 文件中有实际 javascript 的文本,则可以调用 Page.ClientScript.RegisterClientScriptBlock。
以下假设“GetScript()”返回您想要添加到呈现控件的实际 javascript。
Page.ClientScript.RegisterClientScriptBlock(GetType(), "controlScriptName", GetScript());
【讨论】:
我发现这是一种更优雅的方式来修复您的 javascript 的链接。
在您的 .ascx 中,通过以下方式链接到您的脚本文件:
<script src='<%= ResolveClientUrl("~/Scripts/jquery-1.7.1.min.js") %>' type="text/javascript"></script>
<script src='<%= ResolveClientUrl("~/Scripts/jquery.maskedinput-1.3.min.js") %>' type="text/javascript"></script>
这样,无论您将用户控件添加到哪个子文件夹/页面,都将始终正确解析脚本的链接。
【讨论】: