1- /*
1+ /*
22 * Copyright (c) 2014-Present, Facebook, Inc.
33 * All rights reserved.
44 *
88 */
99
1010using System ;
11- using React . Exceptions ;
12- using React . TinyIoC ;
11+ using System . IO ;
1312
1413#if LEGACYASPNET
1514using System . Web ;
1615using System . Web . Mvc ;
1716using IHtmlHelper = System . Web . Mvc . HtmlHelper ;
1817#else
18+ using System . Text . Encodings . Web ;
1919using Microsoft . AspNetCore . Mvc . Rendering ;
2020using IHtmlString = Microsoft . AspNetCore . Html . IHtmlContent ;
2121using Microsoft . AspNetCore . Html ;
@@ -129,16 +129,7 @@ public static IHtmlString ReactWithInit<T>(
129129 }
130130 var html = reactComponent . RenderHtml ( clientOnly , exceptionHandler : exceptionHandler ) ;
131131
132- #if LEGACYASPNET
133- var script = new TagBuilder ( "script" )
134- {
135- InnerHtml = reactComponent . RenderJavaScript ( )
136- } ;
137- #else
138- var script = new TagBuilder ( "script" ) ;
139- script . InnerHtml . AppendHtml ( reactComponent . RenderJavaScript ( ) ) ;
140- #endif
141- return new HtmlString ( html + System . Environment . NewLine + script . ToString ( ) ) ;
132+ return new HtmlString ( html + System . Environment . NewLine + RenderToString ( GetScriptTag ( reactComponent . RenderJavaScript ( ) ) ) ) ;
142133 }
143134 finally
144135 {
@@ -155,23 +146,53 @@ public static IHtmlString ReactInitJavaScript(this IHtmlHelper htmlHelper, bool
155146 {
156147 try
157148 {
158- var script = Environment . GetInitJavaScript ( clientOnly ) ;
149+ return GetScriptTag ( Environment . GetInitJavaScript ( clientOnly ) ) ;
150+ }
151+ finally
152+ {
153+ Environment . ReturnEngineToPool ( ) ;
154+ }
155+ }
156+
157+ private static IHtmlString GetScriptTag ( string script )
158+ {
159159#if LEGACYASPNET
160- var tag = new TagBuilder ( "script" )
161- {
162- InnerHtml = script
163- } ;
164- return new HtmlString ( tag . ToString ( ) ) ;
160+ var tag = new TagBuilder ( "script" )
161+ {
162+ InnerHtml = script ,
163+ } ;
164+
165+ if ( Environment . Configuration . ScriptNonceProvider != null )
166+ {
167+ tag . Attributes . Add ( "nonce" , Environment . Configuration . ScriptNonceProvider ( ) ) ;
168+ }
169+
170+ return new HtmlString ( tag . ToString ( ) ) ;
165171#else
166172 var tag = new TagBuilder ( "script" ) ;
167173 tag . InnerHtml . AppendHtml ( script ) ;
174+
175+ if ( Environment . Configuration . ScriptNonceProvider != null )
176+ {
177+ tag . Attributes . Add ( "nonce" , Environment . Configuration . ScriptNonceProvider ( ) ) ;
178+ }
179+
168180 return tag ;
169181#endif
170- }
171- finally
182+ }
183+
184+ // In ASP.NET Core, you can no longer call `.ToString` on `IHtmlString`
185+ private static string RenderToString ( IHtmlString source )
186+ {
187+ #if LEGACYASPNET
188+ return source . ToString ( ) ;
189+ #else
190+ using ( var writer = new StringWriter ( ) )
172191 {
173- Environment . ReturnEngineToPool ( ) ;
192+ source . WriteTo ( writer , HtmlEncoder . Default ) ;
193+ return writer . ToString ( ) ;
174194 }
195+ #endif
175196 }
176197 }
177198}
0 commit comments