Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET哪个控件可以包装JS块并可提取,以便我可以将其渲染回页眉_Asp.net_Webforms - Fatal编程技术网

ASP.NET哪个控件可以包装JS块并可提取,以便我可以将其渲染回页眉

ASP.NET哪个控件可以包装JS块并可提取,以便我可以将其渲染回页眉,asp.net,webforms,Asp.net,Webforms,作为标题,基本上我在页面中放置了一个用户控件,然后页面被放置在母版页中。我想提取一个javascript块并将其放回页眉。当我尝试将代码包装到任何块控件(例如,服务器上的div runat)中并访问divID.InnerText时,ASP.NET会以 Cannot get inner content of startup_script because the contents are not literal. 我不想在cs文件中提取JS,这是一种非常丑陋的方法(各种各样的逃避,人们甚至不会注意

作为标题,基本上我在页面中放置了一个用户控件,然后页面被放置在母版页中。我想提取一个javascript块并将其放回页眉。当我尝试将代码包装到任何块控件(例如,服务器上的div runat)中并访问divID.InnerText时,ASP.NET会以

Cannot get inner content of startup_script because the contents are not literal.
我不想在cs文件中提取JS,这是一种非常丑陋的方法(各种各样的逃避,人们甚至不会注意到你写了JS,除非他们钻取你的cs文件),我能做什么?


<%@ Page Language="C#"%>
<script runat=server>
    protected override void OnLoad(EventArgs e)
    {
        string scriptText = someID.InnerHtml;
        //if you really want it in the header...
        //Page.Header.Controls.Add( new LiteralControl(String.Format( "<scr" + "ipt language=\"javascript\">{0}</scri" + "pt>\\n", scriptText )));

        //doesnt add to header and requires form runat=server
        Page.ClientScript.RegisterStartupScript(this.GetType(), "SomeScript", scriptText, true);

        base.OnLoad(e);
    }
</script>
<head runat=server></head>
<form runat=server>
<div id="someID" runat=server>alert('hi');</div>
</form>
受保护的覆盖无效加载(事件参数e) { 字符串scriptText=someID.InnerHtml; //如果你真的希望它出现在标题中。。。 //Page.Header.Controls.Add(新的LiteralControl(String.Format(“{0}\\n”,scriptText)); //不添加到标头,需要格式runat=server Page.ClientScript.RegisterStartupScript(this.GetType(),“SomeScript”,scriptText,true); 基础荷载(e); } 警报(“hi”);
您可以将javascript存储在单独的文件中,然后使用page.RegisterClientScriptBlock()将其添加到页面中

将您想要的javascript添加到.js文件中,并将.js文件添加到您的项目中。 更改.js文件的属性,使其成为嵌入式资源

然后在用户控件(可能是页面加载)的某个地方使用如下代码从文件中提取代码并将其放入页面:

string javaScript = "";
// the javascript is in a separate file which is an 'embedded resource' of the dll
using (StreamReader reader = 
    new StreamReader((typeof(ThisClass).Assembly.GetManifestResourceStream(typeof(ThisClass), "NameOfJavaScriptFile.js"))))
{
    javaScript = String.Format("<script language='javascript' type='text/javascript' >\r\n{0}\r\n</script>", reader.ReadToEnd());
}
Page.RegisterClientScriptBlock("MyScriptBlock", javaScript);
stringjavascript=”“;
//javascript位于单独的文件中,该文件是dll的“嵌入式资源”
使用(StreamReader=
新的StreamReader((typeof(ThisClass.Assembly.GetManifestResourceStream(typeof(ThisClass),“NameOfJavaScriptFile.js”))
{
javaScript=String.Format(“\r\n{0}\r\n”,reader.ReadToEnd());
}
RegisterClientScriptBlock(“MyScriptBlock”,javaScript);
请注意,RegisterClientScriptBlock()会将脚本放在页面顶部附近,但显然不会放在页面标题中


(编辑了一段关于注释后标题的内容)

好吧,我可能用了一种非常糟糕的方式,但是我想在最近的一个项目中从用户控件向head元素添加一个脚本。这个脚本不需要我的服务器提供任何数据,但我只希望它出现在特定页面上,因此我将脚本放入一个.js文件中,并将其添加到头部,如下所示:

HtmlGenericControl script = new HtmlGenericControl("script"); // Creates a new script-element
script.Attributes.Add("type","text/javascript");
script.Attributes.Add("src","src/to/js-file.js");
Page.Master.FindControl("head").Controls.Add(script); // Finds the element with ID "head" on the pages master page.
不完全确定代码是否像我认为的那样工作,因为我为项目编写的代码在另一台机器上,但你明白了,对吗

编辑: 在谷歌搜索了一下您的错误消息后,我认为这可能是您问题的解决方案:

using System.IO;

StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
yourDivID.RenderControl(h);
String str = sw.GetStringBuilder().ToString();

如果你结合这两个例子,你应该能够得到你想要的结果。我还没有测试过这个,但它在我的头脑中起作用。

这不会被放在头上。页面客户端脚本块只是在调用时将一些东西扔进页面中——这是我在ASP.NET中非常讨厌的东西。毫无例外,所有的JS都应该放在head中,这对我来说尤其如此,因为我使用jQuery做方法钩子。啊,你的权利,RegisterClientScriptBlock()应该把脚本放在页面开头附近,但实际上并没有把它们放在页眉中。我已经编辑了我的答案,我想当你尝试获取InnerHtml时,它会崩溃,这和我做的一样-你尝试了?我的意思是,Page.Header.Controls.Add部分,你评论的部分似乎无法工作IIRC。它需要,但这是生产代码,所以它肯定能工作问题是我打算放在头上的脚本有一些动态代码需要在服务器上运行时生成(例如,填写控件id),所以包括一个文件不是一个选项。我明白了。我添加了另一个可能对您有所帮助的片段。