2009-05-10 8 views
0

En tant que titre, j'ai un contrôle utilisateur placé à l'intérieur d'une page, puis la page est placée dans la page maître. Je veux extraire un bloc de javascript et le remettre à la tête de la page. Lorsque je tente de placer le code dans un contrôle de bloc (par exemple un serveur div runat) et l'accès divID.InnerText puis ASP.NET avec le buste horsASP.NET dont le contrôle pourrait encapsuler le bloc JS et extractible afin que je puisse le restituer à l'en-tête

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

Je ne veux pas extraire JS dans le fichier cs, thats terriblement laid approche (toutes sortes d'évasions et les gens ne remarqueront même pas que vous avez écrit JS à moins qu'ils ne percent votre fichier CS), que puis-je faire?

Répondre

0
<%@ 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> 
+0

Je pense que ça soufflerait quand vous essayez d'obtenir InnerHtml, c'est le même cas que ce que j'ai fait, vous avez essayé? –

+0

cela fonctionne quand je l'ai testé –

+0

Je veux dire, la partie Page.Header.Controls.Add, la partie que vous avez commenté ne semble pas fonctionner IIRC. –

1

Vous pouvez stocker le javascript dans un fichier séparé, puis l'ajouter à la page en utilisant Page.RegisterClientScriptBlock()

Ajouter le javascript que vous voulez un fichier .js et ajouter le fichier .js à votre projet. Modifiez les propriétés du fichier .js afin qu'il soit une ressource incorporée.

Ensuite, utilisez le code comme ceci quelque part dans votre UserControl (peut-être le Page_Load) pour tirer le code du fichier et déposez-le dans la page:

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

Notez que RegisterClientScriptBlock() mettra le script près de la haut de la page, mais apparemment pas dans l'en-tête de la page.

(bit modifié au sujet de tête après un commentaire)

+0

Ce ne sera pas mis en tête AFAIK. Le bloc de script de la page client jette juste des choses dans la page au moment où vous appelez - c'est quelque chose que je déteste beaucoup dans ASP.NET. Sans exception, tous les JS devraient rester à l'intérieur de la tête, ce qui est particulièrement vrai pour moi parce que j'utilise jQuery pour faire un hook de méthode. –

+0

ah votre droit, RegisterClientScriptBlock() est censé mettre les scripts près du début de la page, mais il ne les met pas réellement dans l'en-tête. J'ai édité ma réponse en conséquence – codeulike

0

D'accord, je l'ai probablement fait cela d'une manière horrible, horrible, mais je voulais ajouter un script à l'élément de tête dans un projet récent d'un contrôle utilisateur . Ce script n'a pas besoin de données de mon serveur, mais je voulais seulement sur des pages spécifiques, donc je mets le script dans un fichier .js-et ajouté à la tête comme ceci:

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. 

Non Tout à fait sûr si le code fonctionne comme je pense qu'il fait comme le code que j'ai écrit pour le projet est sur une autre machine, mais vous avez l'idée, non?

Edit: Après googler votre message d'erreur pour un peu, je pense que cela pourrait être une solution à votre problème:

using System.IO; 

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

Si vous combinez les deux exemples, vous devriez être en mesure d'obtenir le résultat que vous vouloir. Je n'ai pas testé cela, mais ça marche dans ma tête.

+0

Le problème est le script que j'ai l'intention de mettre sur l'en-tête avoir un code dynamique doit être généré sur le serveur (par exemple remplir l'ID de contrôle) afin d'inclure un fichier n'est pas une option. –

+0

Je vois. J'ai ajouté un autre extrait qui pourrait vous aider. –