如何以编程方式将Javascript文件添加到用户控件?
我希望用户控件是一个完整的包 - 也就是说,当我可以在控件本身内部进行操作时,我不想在页面上添加与用户控件相关的javascript。
由于用户控件中没有Page对象,你会怎么做?
答案 0 :(得分:26)
在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标签中,只需确保头部有runat =“server”。
答案 1 :(得分:8)
您可以使用ClientScriptManager注册客户端脚本。 可以通过Control.Page属性访问页面。
Page.ClientScript.RegisterClientScriptInclude (
typeof ( MyControl ), "includeme.js", "js/includeme.js" );
编辑:对不起,对于一个完整的“完整包”,可以使用脚本作为嵌入式资源, 并通过WebResource.axd处理程序获取动态URL。 如果这不被认为是完全完整的,那么我想它可以放在App_LocalResources中,但它永远不会只是一个文件, 除非代码和脚本是内联的。
答案 2 :(得分:6)
与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
答案 3 :(得分:3)
在我的网站中,我将所有需要的脚本和样式放到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
答案 4 :(得分:2)
好问题!
UserControl应该是一个包,不依赖于JavaScript或CSS文件。您需要将JS和CSS文件作为嵌入式资源。右键单击属性并将构建操作设置为嵌入资源。然后,您需要将JavaScript和CSS文件作为WebResources注入。
这是我昨天写的一篇文章,讨论了同样的情况:
http://highoncoding.com/Articles/502_Creating_RadioButton_Validation_Using_Custom_Validator.aspx
答案 5 :(得分:0)
我通常在为控件呈现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]);
}
答案 6 :(得分:0)
如果您的.CS文件中包含实际javascript的文本,则可以调用Page.ClientScript.RegisterClientScriptBlock。
以下假设“GetScript()”返回要添加到渲染控件的实际 javascript。
Page.ClientScript.RegisterClientScriptBlock(GetType(), "controlScriptName", GetScript());
答案 7 :(得分:0)
我发现这是一种更优雅的方式来修复链接到您的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>
这样,无论您将用户控件添加到哪个子文件夹/页面,都可以正确解析脚本链接。