Hatena::Groupsubtech

ういはるかぜの化学

Thursday, June 16, 2011

ViewStringとしてレンダリングする(Rails 3とASP.NET MVC 3) 16:33 ViewをStringとしてレンダリングする(Rails 3とASP.NET MVC 3) - ういはるかぜの化学 を含むブックマーク はてなブックマーク - ViewをStringとしてレンダリングする(Rails 3とASP.NET MVC 3) - ういはるかぜの化学

たまにViewをレンダリングした結果をStringとして取得したいときがありますよね(素のeRubyとかRazorとかではなく)。そんなときのやり方。

ちなみにRailsASP.NET MVCを比較する意図ではなくて、たまたま同じことをしたのでまとめて書いてしまっているだけです。

Rails

view = ActionView::Base.new('/path/to/template_dir/',
                            { :foo => 'bar', :homuhomu => 'hauhau' },
                            nil)
rendered = view.render(:layout => nil, :file => 'view.erb')

ちなみにヘルパーを使いたいときにはActionView::Baseを継承したクラスを作ってあげればいい感じです。

class View < ActionView::Base
  include ApplicationHelper
  include SugoiHelper
  include YabaiHelper
end

ASP.NET MVC 3

String pageName = "Nantoka";
StringWriter textWriter = new StringWriter();
ViewEngineResult view = ViewEngines.Engines.FindView(ControllerContext, pageName, null);
ViewContext viewContext = new ViewContext(ControllerContext, view.View, ViewData, TempData, textWriter);
viewContext.ViewData.Model = input;
view.View.Render(viewContext, textWriter);

String result = textWriter.ToString();

これはコントローラのアクションで呼び出す前提なのでそうでない場合にはもっと工夫しないとだめです(たぶんめんどくさい)。

ASP.NET MVCというかRazorの場合には普通にViewのファイルが格納されているところのWeb.configで設定できます。

faeriefaerie2011/06/16 21:15Rails は render_to_string でできませんかしら。

mayukimayuki2011/06/16 21:27あ、ちょっと書き忘れてましたが、やりたかったこととして自動エスケープなどActionView::Baseの機能を使いつつもテンプレートディレクトリのルートを変更したい(layoutsも)というのがあったのでこうしていました。

トラックバック - http://subtech.g.hatena.ne.jp/mayuki/20110616