2011-08-08 12 views
4
でFindView

を使用した:素敵なフォーマットされた電子メールを送信するために、ビューの内容をレンダリングするプロセスの一部として私が使用しようとしているオーチャード

var viewEngineResult = ViewEngines.Engines.FindView(ControllerContext, myViewName, null); 

。オーチャード・コントローラーの中で使っています。オーチャードの外でも同様のコードをMVCプロジェクトで使用していますが、正常に動作します。オーチャードしかし

このコードを実行するには、私が探しているのビューを見つけるために失敗し、0の位置を探索したビューエンジンの結果を返します。

  • SearchedLocations:カウント= 0、
  • ビュー:ヌル、
  • ViewEngine:

ヌルはこの理由があるの

viewEngineResultは、それが呼び出された後、次の値を持っていますオーチャードでは機能しませんし、それを機能させる方法はありますか?

答えて

4

私はあなたが特定のIViewEngineProviderとThemeAwareViewEngineで、Orchard.Framework/MVC/ViewEnginesに近い見てみたいと思います。オーチャードでは、テーマ、マルチテナンシー、そしてより豊かな環境のように、この仕事をするために必要なことがたくさんあります。 ここで起こりそうなことは、ビューエンジンがビューを解決してチェーンからオプトアウトするのに十分な情報を持っていないということです。 ThemeAwareViewEngine.FindViewにブレークポイントを置き、そのクラスのプライベート依存フィールドを調べることができます。静的関数を使用してFindViewを取得すると、おそらく依存関係の注入が適切に行われない可能性があるため、nullであれば驚くことはありません。 もう一度私はちょうど推測しています。

+0

民間依存フィールドすべては罰金に見えるが、それが失われているように見えるので、それは、ヌルとして設定された現在のテーマを持っています。私は〜/を追加しようとしましたが、BareEnginesを使って適切な場所で検索するビューに完全なパスを与えましたが、まだビューが見つかりませんでした。代わりにパーツテンプレートをフックしてそれらを使用してメールのコンテンツを取得する方法はありますか? –

+1

静的な呼び出しを通常のMVC APIに使用するのではなく、独自のコードにIViewEngineProviderのインスタンスを注入してそこから開始しようとしましたか? –

+0

近づいているようです。私は注入されたIViewEngineProviderを使用してモジュールビューエンジンを作成しています。これには、仮想パスのコレクションを含むCreateModulesViewEngineParamsオブジェクトが必要です。それを得る方法はありますか、私は間違った方向に向かいましたか? –

6

この回答は、バートランドで私に与えられたアドバイスに基づいて、私は私が発見したのだものと一緒にそれを持って来たいと思いましたさ。

私は私のコントローラにIViewEngineProviderのインスタンスを注入するために必要なFindPartialView使用できるようにします。

私は、ビューを解決してレンダリングするために、次のコードを使用:

private String RenderView(String viewName, object model) 
{ 
    var paths = new List<string>(); // This can just be an empty list and it still finds it. 
    var viewEngine = _viewEngineProvider.CreateModulesViewEngine(new CreateModulesViewEngineParams {VirtualPaths = paths}); 
    var viewResult = viewEngine.FindPartialView(ControllerContext, viewName, false); 

    if (viewResult.View == null) { 
     throw new Exception("Couldn't find view " + viewName); 
    } 

    var viewData = new ViewDataDictionary {Model = model}; 

    using (var sw = new StringWriter()) 
    { 
     var viewContext = new ViewContext(ControllerContext, viewResult.View, viewData, TempData, sw); 
     viewResult.View.Render(viewContext, sw); 

     return sw.GetStringBuilder().ToString(); 
    } 
} 
+0

悲しいことに、オーチャード1.10.1で動作しません。空の 'paths'が例外を引き起こします。 – ViRuSTriNiTy

+0

私は単純に 'IThemeAwareViewEngine'を注入し、その' FindPartialView'メソッドを使うことができると信じています。 – Lawyerson

関連する問題