2009-09-01 24 views
0

「問題」は、FormView内にASP.NET TextBoxがあり、Textプロパティがデータベーステーブルフィールドにバインドされていることです。場合によっては、データベースに通常のテキストと組み合わされたHTMLコードが存在することがあります。 RequestEncodingとResponseEncodingは "iso-8859-1"(whitはlatin1)に設定されています。 latin1文字とキリル文字を組み合わせることができるフィールドがいくつかあります。キリル文字を入力するときは問題ありません(例:д)。 RequestEncodingがiso-8859-1に設定され、ブラウザの文字セットにも同様に設定されているため、ブラウザはдを "&#1076"に変更します。これはデータベースに保存されます。それは私が欲しいものですが、 "д" 「& amp;#1076;」に変換されます。レスポンスの出力がブラウザに送信される前にASP.NET TextBoxのTextプロパティに設定されていると、「д」と表示されます。データを保存した後ASP.NET TextBoxのコンテンツをHTMLエンコードしないようにするにはどうすればよいですか?

誰でも私はその変換からASP.NETを停止する方法を教えていただけますか?

代わりに、すべてのコントロールがレンダリングされた後にASPXサイトのコンプリート出力を変更する方法はありますか? - 「& amp;#」を「&#」に置き換えることができます。

+0

ここで、コードにはテキストがエンコードされているという問題がありますか? –

答えて

0

私は(PortageMonkeyが私に道を示した)私の問題を解決しました:私はクラス "IsoTextBox" を作成し

ファーストいますSystem.Web.UI.WebControls.TextBoxから継承します。 Textプロパティは常にエンコードされていない文字列を返すため、Textプロパティの属性を変更するだけでそのジョブは実行されませんでした。代わりに、私は、Renderメソッドoverrote:

protected override void Render(HtmlTextWriter writer) 
{ 
    StringWriter stringWriter = new StringWriter(); 
    HtmlTextWriter source = new HtmlTextWriter(stringWriter); 
    base.Render(source); 
    writer.Write(stringWriter.ToString().Replace("&#", "&#")); 
} 

をそしてweb.configファイルに追加されたtagMappingより:これは非常にうまく機能

<system.web> 
     <pages> 
     <tagMapping> 
     <add mappedTagType="MyNamespace.IsoTextBox" tagType="System.Web.UI.WebControls.TextBox"/> 
     </tagMapping> 
     </pages> 
     <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/> 
</system.web> 

0

あなただけのデータベースに挿入する前にテキストをデコードすることができます

string htmlEncodedText = myTextbox.Text; 
string htmlDecodedText = HttpUtility.UrlDecode(htmlEncodedText); 

Encoding latinEncoding = Encoding.GetEncoding("8859-1"); 
Encoding utfEncoding = Encoding.UTF8; 
byte[] utfBytes = utfEncoding .GetBytes(htmlDecodedText); 
byte[] latinBytes = 
    System.Text.Encoding.Convert(utfEncoding, latinEncoding, utfBytes); 
string latinString = latinEncoding.GetString(latinBytes); 

// TODO: Insert latinString into database 
+0

申し訳ありませんが、データベースは完全にlatin1キャラクタセットである必要があります。ここでユニコードまたはutf8文字は使用できません –

1

私は単にテキストボックスから継承し、Textプロパティをオーバーライドし、これを達成しました。現在、PersistenceMode.EncodedInnerDefaultPropertyという属性があります。あなたはInnerDefaultPropertyにそれを変更したい:

[BindableAttribute(true, BindingDirection.TwoWay)] 
[PersistenceModeAttribute(PersistenceMode.EncodedInnerDefaultProperty)] 
public virtual string Text { get; set; } 

あなたは、これはすべてのあなたのテキストボックスに適用する場合は、あなたがそれを行うには、タグのマッピングを使用することができます。

参考資料

More on Persistence Mode
More on Textbox.Text property
More on Tag Mapping

+0

ありがとうございます!あなたの答えは正しい方法を私に指摘しました。私の答えは下記をご覧ください。 –

関連する問題