依存性の注入電力は、.NETのコアの魅力:MVCのビューには、中国のHTMLコーディングの問題を解決するために
公園の友人がボーに尋ね、そのような疑問を提起してきた- .NETのコアの中国やその他の非英語のテキスト、HTMLコーディング出力の問題、私たちのASP.NETコアプロジェクトを見、同じ問題があります。
カミソリは、以下のコードを例を表示します。
{@ ViewBag.Title = "コードが世界を変える"; } <タイトル> ViewBag.Title @ </ TITLE>
htmlコードの出力は次のようになります。
<タイトル>&#x4EE3;&#x7801の;&#x6539の;&#x53D8;&#x4E16;&#x754Cの; </ TITLE>
上記の 次のコードを効果的に同等ViewBag.Title @:
@ Html.Raw(Html.Encode(ViewBag.Title))
したがって、この問題を解決するためのHtmlHelperにASP.NET MVCのコアから(HTML上記のコードでは型がHtmlHelperのである)で開始する必要があります。
HtmlHelper.Encode()の実装を見ることがGitHubのからMVCのソースコードをチェックアウト:
プライベート読み取り専用IHtmlGenerator _htmlGenerator。 パブリック文字列エンコード(文字列値) { _htmlGenerator.Encode(値)を返します。 }
エンコードIHtmlGenerator実際のコール・インタフェース()メソッドは、MVCは、このインタフェースを実装し、次のようにエンコード()コードに相当DefaultHtmlGeneratorがあるれます。
プライベート読み取り専用HtmlEncoder _htmlEncoder。 公共の文字列のエンコード(文字列値) { !string.IsNullOrEmpty(値)を返しますか?_htmlEncoder.Encode(値):String.Emptyを。 }
本当の主人公のオリジナル作品がHtmlEncoderですが、それはMVCで実装されますが、.NET Frameworkのコアに実装されていない、名前空間がある System.Text.Encodings.Webは 。
それは非難しないことを確認するためにHtmlEncoderを呼び出して直接.NETコアコンソールプログラムを書きます。
パブリッククラスプログラム { のpublic static無効メイン(文字列[] args) { Console.WriteLineを(HtmlEncoder.Default.Encode( "代码改变世界")); } }
MVCの出力は、同じ問題です。
インスタンス(HtmlEncoder.Default)をHtmlEncoderデフォルトのないようにしてください、彼らの呼び出しHtmlEncoder.Create()メソッドは、インスタンスを作成し、その後、UnicodeRangeパラメータの種類を発見しました。
パブリック静的HtmlEncoder(paramsはUnicodeRange [] allowedRanges)を作成します。
パラメータとしてHtmlEncoderインスタンスUnicodeRanges.Allを作成する場合、問題が解決されます。
Console.WriteLineを(HtmlEncoder.Create(UnicodeRanges.All).Encode( "コード変更の世界"));
その後、GitHubのからSystem.Text.Encodings.Webのソースコードをチェックアウトし、それらがどのように作成されるかHtmlEncode対応HtmlEncoder.Defaultの例を参照してください。
内部読み取り専用静的DefaultHtmlEncoderシングルトン=新しいDefaultHtmlEncoder(新しいTextEncoderSettings(UnicodeRanges.BasicLatin))。
UnicodeRanges.Allをデフォルトでない理由UnicodeRanges.BasicLatin、中国がエンコードされていない不思議を使用していた、私は理解していませんか?
それは限り、我々HtmlEncoder.Create(UnicodeRanges.All)がHtmlEncoderインスタンスを作成し、MVCで使用されるデフォルトのHtmlEncoder例に取って代わるように、難しいことではありません解決するために、問題の原因を知っています。どのようにそれを交換するには?
戻るMVCのソースコードに、実装DefaultHtmlGeneratorを見てそのコンストラクタのパラメータはHtmlEncoderを持っているが見つかりました:
公共DefaultHtmlGenerator( IAntiforgery antiforgery、 IOptions <MvcViewOptions> optionsAccessor、 IModelMetadataProvider metadataProvider、 IUrlHelperFactory urlHelperFactory、HtmlEncoder htmlEncoder、 ClientValidatorCache clientValidatorCache) { }
上から下へ、.NETによると、内部のうち、完全な依存性注入の気概から、この場所にも依存関係の注入、我々は唯一の可能な新しいHtmlEncoderインスタンスを注入する必要があるはずです、それはそうではないのですか?
一つのラインコード、あなたが知っています。
Startup.cs ConfigureServices()メソッドに次のコード行を追加します。
services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All))。
次のようにASP.NETコアサイトを実行し、出力結果は以下のとおりです。
世界を変えた<タイトル>コード</ TITLE>
ライン注入、すぐに対処。依存性注入のパワー、.NETのコアの魅力。
アップデート1:によると 、火災ゼロ コメント、よりよい解決策があります
services.Configure <WebEncoderOptions>(オプション=> { options.TextEncoderSettings =新しいTextEncoderSettings(UnicodeRanges.All); });
アップデート2:後で、より良い解決策を見つけました
services.Configure <WebEncoderOptions>(オプション=> options.TextEncoderSettings =新しいTextEncoderSettings(UnicodeRanges.BasicLatin、 UnicodeRanges.CjkUnifiedIdeographs))。
公園の友人がボーに尋ね、そのような疑問を提起してきた- .NETのコアの中国やその他の非英語のテキスト、HTMLコーディング出力の問題、私たちのASP.NETコアプロジェクトを見、同じ問題があります。
カミソリは、以下のコードを例を表示します。
{@ ViewBag.Title = "コードが世界を変える"; } <タイトル> ViewBag.Title @ </ TITLE>
htmlコードの出力は次のようになります。
<タイトル>&#x4EE3;&#x7801の;&#x6539の;&#x53D8;&#x4E16;&#x754Cの; </ TITLE>
上記の 次のコードを効果的に同等ViewBag.Title @:
@ Html.Raw(Html.Encode(ViewBag.Title))
したがって、この問題を解決するためのHtmlHelperにASP.NET MVCのコアから(HTML上記のコードでは型がHtmlHelperのである)で開始する必要があります。
HtmlHelper.Encode()の実装を見ることがGitHubのからMVCのソースコードをチェックアウト:
プライベート読み取り専用IHtmlGenerator _htmlGenerator。 パブリック文字列エンコード(文字列値) { _htmlGenerator.Encode(値)を返します。 }
エンコードIHtmlGenerator実際のコール・インタフェース()メソッドは、MVCは、このインタフェースを実装し、次のようにエンコード()コードに相当DefaultHtmlGeneratorがあるれます。
プライベート読み取り専用HtmlEncoder _htmlEncoder。 公共の文字列のエンコード(文字列値) { !string.IsNullOrEmpty(値)を返しますか?_htmlEncoder.Encode(値):String.Emptyを。 }
本当の主人公のオリジナル作品がHtmlEncoderですが、それはMVCで実装されますが、.NET Frameworkのコアに実装されていない、名前空間がある System.Text.Encodings.Webは 。
それは非難しないことを確認するためにHtmlEncoderを呼び出して直接.NETコアコンソールプログラムを書きます。
パブリッククラスプログラム { のpublic static無効メイン(文字列[] args) { Console.WriteLineを(HtmlEncoder.Default.Encode( "代码改变世界")); } }
MVCの出力は、同じ問題です。
インスタンス(HtmlEncoder.Default)をHtmlEncoderデフォルトのないようにしてください、彼らの呼び出しHtmlEncoder.Create()メソッドは、インスタンスを作成し、その後、UnicodeRangeパラメータの種類を発見しました。
パブリック静的HtmlEncoder(paramsはUnicodeRange [] allowedRanges)を作成します。
パラメータとしてHtmlEncoderインスタンスUnicodeRanges.Allを作成する場合、問題が解決されます。
Console.WriteLineを(HtmlEncoder.Create(UnicodeRanges.All).Encode( "コード変更の世界"));
その後、GitHubのからSystem.Text.Encodings.Webのソースコードをチェックアウトし、それらがどのように作成されるかHtmlEncode対応HtmlEncoder.Defaultの例を参照してください。
内部読み取り専用静的DefaultHtmlEncoderシングルトン=新しいDefaultHtmlEncoder(新しいTextEncoderSettings(UnicodeRanges.BasicLatin))。
UnicodeRanges.Allをデフォルトでない理由UnicodeRanges.BasicLatin、中国がエンコードされていない不思議を使用していた、私は理解していませんか?
それは限り、我々HtmlEncoder.Create(UnicodeRanges.All)がHtmlEncoderインスタンスを作成し、MVCで使用されるデフォルトのHtmlEncoder例に取って代わるように、難しいことではありません解決するために、問題の原因を知っています。どのようにそれを交換するには?
戻るMVCのソースコードに、実装DefaultHtmlGeneratorを見てそのコンストラクタのパラメータはHtmlEncoderを持っているが見つかりました:
公共DefaultHtmlGenerator( IAntiforgery antiforgery、 IOptions <MvcViewOptions> optionsAccessor、 IModelMetadataProvider metadataProvider、 IUrlHelperFactory urlHelperFactory、HtmlEncoder htmlEncoder、 ClientValidatorCache clientValidatorCache) { }
上から下へ、.NETによると、内部のうち、完全な依存性注入の気概から、この場所にも依存関係の注入、我々は唯一の可能な新しいHtmlEncoderインスタンスを注入する必要があるはずです、それはそうではないのですか?
一つのラインコード、あなたが知っています。
Startup.cs ConfigureServices()メソッドに次のコード行を追加します。
services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All))。
次のようにASP.NETコアサイトを実行し、出力結果は以下のとおりです。
世界を変えた<タイトル>コード</ TITLE>
ライン注入、すぐに対処。依存性注入のパワー、.NETのコアの魅力。
アップデート1:によると 、火災ゼロ コメント、よりよい解決策があります
services.Configure <WebEncoderOptions>(オプション=> { options.TextEncoderSettings =新しいTextEncoderSettings(UnicodeRanges.All); });
アップデート2:後で、より良い解決策を見つけました
services.Configure <WebEncoderOptions>(オプション=> options.TextEncoderSettings =新しいTextEncoderSettings(UnicodeRanges.BasicLatin、 UnicodeRanges.CjkUnifiedIdeographs))。