依存性注入のパワー、.NETのコアの魅力:中国は、HTMLの問題をコーディングしているMVCのビューを解決するために:中国の問題を解決するためのMVCのビューでは、HTMLの依存性の注入のパワー、.NETのコアの魅力をコーディングしています

依存性の注入電力は、.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))。

おすすめ

転載: www.cnblogs.com/1laowang/p/11490274.html