简体   繁体   中英

How to deal with linebreaks when outputting Javascript from code behind

I'm outputting client side function calls from code behind via

Page.ClientScript.RegisterStartupScript( this.GetType(), "supportItems", scriptCalls, true );

scriptCalls contains call(s) to a client side function that has several string arguments taken from database and that then displays the parameters in HTML textareas, so line breaks need to ultimately be preserved. If the DB value includes a linebreak then the linebreak gets included in the outputted client script which of course then causes a client script error.

I have tried passing the DB values through a cleaning function to replace line breaks ala:

private string CleanJavaScriptString( string stringToClean )
{
    string cleanString = stringToClean.Replace( "'", "\'" );
cleanString = cleanString.Replace( Environment.NewLine, "\n" );
return cleanString;
}

But this still outputs the actual line break in the code. How can I achieve this?

you need to double escape the line break so...

private string CleanJavaScriptString( string stringToClean )
{
    string cleanString = stringToClean.Replace( "'", "\'" );
cleanString = cleanString.Replace( Environment.NewLine, "\\n" );
return cleanString;
}

If you have access to it (.NET 3.5 onwards), the best bet it to use JavaScriptSerializer ...

Private Sub MesgBox(ByVal sMessage As String)
  Dim serializer as New System.Web.Script.Serialization.JavaScriptSerializer()
  Dim msgedtble As String = serializer.Serialize(sMessage)
  Page.ClientScript.RegisterStartupScript(Me.GetType, "myScripts",
    "<script type='text/javascript'>alert(" & msgedtble & ");</script>")
End Sub

This is taken from the this question/answer .

The advantage of the JavaScriptSerializer is that it will deal with quotes, newlines - and all the characters you might not have thought about, which would affect JavaScript.

EDIT

And here is a C# equivalent to what you're asking for...

private string CleanJavaScriptString( string stringToClean )
{
  System.Web.Script.Serialization.JavaScriptSerializer serializer = new 
    System.Web.Script.Serialization.JavaScriptSerializer();
  return serializer.Serialize(stringToClean);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM