トップ回答者
コンパイルエラーについて

質問
-
はじめまして、ASP.NETの学習をはじめたnoriyasuと申します。
ASP.NET4.0 でC#で学習中です。
この度、ある入門書を購入し、それを参考に学習を進めているのですが、
コンパイルエラーが発生して実行できなくて、困っています。
内容は
コンパイル エラー メッセージ: CS1061: 'object' に 'Replace' の定義が含まれておらず、型 'object'
の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。エラーコード:<asp:Label ID="BodyLabel" runat="server" Text='<%# Eval("Body").Replace(vbLf, "<br />") %>' />
です。
学習をはじめたばかりなので、解決法が分かりません。どなたか、良い解決方法を御伝授ください。
よろしくお願い致します。
回答
-
C# の基本的な文法として、明示的な型変換(キャスト)が必要
なケースがあることを理解されているでしょうか? 今回の場合、
object 型から string 型へのキャストが必要です。Eval メソッドの正体は何かというと、DataBinder.Eval 静的メ
ソッドです。例えば、Text='<%# Eval("Body") %>'
とすると、DataBinder.Eval を以下のように呼び出します。
Text='<%# DataBinder.Eval(Container.DataItem, "Body") %>'
DataBinder.Eval は object 型を返しますが、object 型には
Replace というメソッドは含まれないので、今回のエラーが出た
というわけです。以下のように string 型にキャストしてから Replace メソッドを
適用します。なお、vbLf は Visual Basic 用ですので、C# の場
合は "\n" としてください。Text='<%# ((string)Eval("Body")).Replace("\n", "<br />") %>'>
不特定多数のユーザー入力を表示するような場合は、セキュリティ
対策として、ブラウザに表示する前に HtmlEncode することをお勧
めします。以下のような感じです。Text='<%# Server.HtmlEncode((string)Eval("Body")).Replace("\n", "<br />") %>'>
- 回答としてマーク noriyasu 2012年6月8日 13:47
すべての返信
-
C# の基本的な文法として、明示的な型変換(キャスト)が必要
なケースがあることを理解されているでしょうか? 今回の場合、
object 型から string 型へのキャストが必要です。Eval メソッドの正体は何かというと、DataBinder.Eval 静的メ
ソッドです。例えば、Text='<%# Eval("Body") %>'
とすると、DataBinder.Eval を以下のように呼び出します。
Text='<%# DataBinder.Eval(Container.DataItem, "Body") %>'
DataBinder.Eval は object 型を返しますが、object 型には
Replace というメソッドは含まれないので、今回のエラーが出た
というわけです。以下のように string 型にキャストしてから Replace メソッドを
適用します。なお、vbLf は Visual Basic 用ですので、C# の場
合は "\n" としてください。Text='<%# ((string)Eval("Body")).Replace("\n", "<br />") %>'>
不特定多数のユーザー入力を表示するような場合は、セキュリティ
対策として、ブラウザに表示する前に HtmlEncode することをお勧
めします。以下のような感じです。Text='<%# Server.HtmlEncode((string)Eval("Body")).Replace("\n", "<br />") %>'>
- 回答としてマーク noriyasu 2012年6月8日 13:47