第3回 ActionResultオブジェクトでアクション操作も自由自在:連載:ASP.NET MVC入門(2/5 ページ)
コントローラでのアクションの実行が完了すると、その結果はActionResultにまとめられる。そのさまざまな派生オブジェクトについて見ていこう。
任意のテキスト・コンテンツを出力する− ContentResultオブジェクト −
アクション・メソッドの結果を(ビュー・スクリプトに反映させるのではなく)そのままテキスト・コンテンツとして出力するには、ContentResultオブジェクトを利用すればよい。ContentResultオブジェクトは、ControllerクラスのContentメソッドを経由して、呼び出すことができる。
例えば、アクション・メソッドからプレーン・テキスト(ここでは「こんにちは、世界!」というテキスト)を出力するためのコードであれば、次のように記述すればよい*2。
*2 コントローラ・クラス(ここではResultController)そのものの作成方法については、前回までの内容に従うものとする。
public ActionResult Plain() {
return Content("こんにちは、世界!", "text/plain");
}
Function Plain() As ActionResult
Return Content("こんにちは、世界!", "text/plain")
End Function
実行時の表示結果は次のようになる。
Contentメソッドの構文は、次のとおりである。
Content(content As String, [contentType As String, [contentEncoding As Encoding]])
' content:出力するコンテンツ
' contentType:コンテンツ・タイプ
' contentEncoding:出力の文字エンコーディング
リスト1では、引数contentTypeの内容を直接に文字列として指定しているが、MediaTypeNames.Textクラス(System.Net.Mime名前空間)を利用することで、以下のように書き換えることも可能だ。ややコードは長くなるが、この記法であれば、Visual StudioのIntelliSense機能を利用できるというメリットがある。
Return Content("こんにちは、世界!", _
System.Net.Mime.MediaTypeNames.Text.Plain)
はたまた、コンテンツ・タイプを指定する必要がないならば、リスト1のコードは、略して以下のように記述することも可能だ。ただし、この記法ではコンテンツ・タイプはデフォルトの「text/html」と認識されることになるので注意されたい。
public String Plain() {
return "こんにちは、世界!";
}
Function Plain() As String
Return "こんにちは、世界!"
End Function
これまで、「アクション・メソッドは戻り値としてActionResult(派生)オブジェクトを返さなければならない」という説明をしてきたが、正確には、アクション・メソッドは任意のオブジェクトを返すことができる。
アクション・メソッドがActionResult(派生)オブジェクト以外のオブジェクトを返した場合、ASP.NET MVCはオブジェクトの内容をConvert.ToStringメソッドで文字列表現に変換したうえで、これを基に自動的にContentResultオブジェクトを生成するのである。
■例:データベースの内容をカンマ区切りテキストとして出力する
ContentResultオブジェクトを利用した具体的な例として、ここではデータベースから取得した内容をカンマ区切りテキスト形式で出力してみよう(リスト3)。
データ元となるデータベースとしては、前回も登場したBookテーブル(MyMvc.mdf.zip)を利用するものとし、データベース・アクセスのためのEntity Dataモデルも前回作成したMyMvc.edmxがあらかじめ用意されているものとして、話を進める。
using System.Text;
using MvcAppCs.Models;
……中略……
public ActionResult Csv() {
var _db = new MyMvcEntities();
var builder = new StringBuilder();
// Bookテーブルからpublished列について降順で全レコードを取得
var boks = (from b in _db.Book
orderby b.published descending select b).ToList();
// 各フィールドの値をカンマ区切りで連結したうえで、
// さらに、レコード同士を改行区切りで連結
boks.ForEach(t =>
builder.Append(String.Format("{0},{1},{2},{3}",
t.isbn, t.title, t.price, t.publish) + "\r\n"));
// 生成された文字列を「text/csv」形式(Shift_JIS)で出力
return Content(builder.ToString(),
"text/csv", Encoding.GetEncoding("Shift_JIS"));
}
Function Csv() As ActionResult
Dim _db = New MyMvcEntities()
Dim builder As New StringBuilder()
' Bookテーブルからpublished列について降順で全レコードを取得
Dim boks = (From b In _db.Book _
Order By b.published Descending Select b).ToList()
' 各フィールドの値をカンマ区切りで連結したうえで、
' さらに、レコード同士を改行区切りで連結
boks.ForEach(Function(t) _
builder.Append(String.Format("{0},{1},{2},{3}", _
t.isbn, t.title, t.price, t.publish) & Chr(13) & Chr(10)))
' 生成された文字列を「text/csv」形式(Shift_JIS)で出力
Return Content(builder.ToString(), _
"text/csv", Encoding.GetEncoding("Shift_JIS"))
End Function
出力されたカンマ区切りテキストをファイルに保存し、それをExcelで開くと次のようになる。
このように、ContentResultオブジェクトが出力できるのは、text/plain形式のテキストばかりではない。引数contentTypeを変更することで、この例のようにカンマ区切りテキスト形式やXML(eXtensible Markup Language)形式、RSS(RDF Site Summary)形式などのコンテンツを出力することができる。例えば、データベースの内容をRSSフィードとして出力する方法については、後日「.NET TIPS:ASP.NET MVCでRSSフィードを生成するには?」で紹介の予定である。
Copyright© Digital Advantage Corp. All Rights Reserved.