連載
» 2009年07月10日 00時00分 公開

第3回 ActionResultオブジェクトでアクション操作も自由自在連載:ASP.NET MVC入門(2/5 ページ)

[山田祥寛(http://www.wings.msn.to/),著]

任意のテキスト・コンテンツを出力する− 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

リスト1 プレーン・テキストを出力するためのコード(上:ResultController.cs、下:ResultController.vb)

 実行時の表示結果は次のようになる。

図1 サンプルの実行結果(http://localhost:4419/Result/Plain)
指定されたテキストがそのまま出力されている。

 Contentメソッドの構文は、次のとおりである。

Content(content As String, [contentType As String, [contentEncoding As Encoding]])
' content:出力するコンテンツ
' contentType:コンテンツ・タイプ
' contentEncoding:出力の文字エンコーディング

Contentメソッドの構文(VB)

 リスト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

リスト2 プレーン・テキストを出力するためのコード(上:ResultController.cs、下:ResultController.vb)

 これまで、「アクション・メソッドは戻り値として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

リスト3 Bookテーブルの内容をカンマ区切りテキスト形式で出力するためのコード(上がResultController.cs、下がResultController.vb)

 出力されたカンマ区切りテキストをファイルに保存し、それをExcelで開くと次のようになる。

図2 ダウンロードしたカンマ区切りテキストをMicrosoft 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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。