ASP.NET, который может обернуть блок JS и извлечь его, чтобы я мог вернуть его в заголовок - PullRequest
0 голосов
/ 10 мая 2009

Как заголовок, в основном у меня есть пользовательский элемент управления, размещенный внутри страницы, а затем страница помещается внутри главной страницы. Я хочу извлечь блок JavaScript и положить его обратно в заголовок страницы. Когда я пытаюсь обернуть код внутри любого блочного элемента управления (например, сервера div runat) и получить доступ к divID.InnerText, ASP.NET перестанет работать с

Cannot get inner content of startup_script because the contents are not literal.

Я не хочу извлекать JS из файла cs, это ужасно уродливый подход (все виды побегов, и люди даже не заметят, что вы написали JS, если они не сверлят ваш CS-файл), что я могу сделать?

Ответы [ 3 ]

1 голос
/ 10 мая 2009

Вы можете сохранить JavaScript в отдельном файле, а затем добавить его на страницу, используя Page.RegisterClientScriptBlock ()

Добавьте нужный javascript в файл .js и добавьте файл .js в свой проект. Измените свойства файла .js, чтобы он был встроенным ресурсом.

Затем используйте такой код где-то в вашем UserControl (возможно, Page_Load), чтобы извлечь код из файла и перетащить его на страницу:

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);

Обратите внимание, что RegisterClientScriptBlock () поместит скрипт в верхнюю часть страницы, но, очевидно, не в заголовок страницы.

(отредактированный бит о заголовке после комментария)

0 голосов
/ 11 мая 2009

Хорошо, я, вероятно, сделал это ужасным, ужасным способом, но я хотел добавить скрипт в элемент 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.

Не совсем уверен, работает ли код так, как я думаю, и работает, как код, который я написал для проекта, на другом компьютере, но вы поняли идею, верно?

Edit: После небольшого поиска в сообщении об ошибке, я думаю, что это может быть решением вашей проблемы:

using System.IO;

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

Если вы объедините два примера, вы сможете получить желаемый результат. Я не проверял это, но это работает в моей голове.

0 голосов
/ 10 мая 2009
<%@ 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...