2011-09-09 5 views
0

このメソッドは、最後のparam masterNameにnullを渡すとうまくいきます。私のクラスでの私のビューの設定は、RazorViewEngineの作業から派生しています。好奇心からmasterNameパラメータが何のために使われていますか?私はまず、layout.cshtmlのためだと思ったかもしれません。レイアウトを渡すと、例外がスローされます。これがどのように使われるべきか、それは何を探していますか? (ほとんどLOL)ViewEngines.Engines.FindViewメソッドとmasterNameパラメータについての質問

カスタムビューエンジン

public class CustomRazorViewEngine : RazorViewEngine 
{ 
    private readonly string[] NewViewFormats = new[] 
                { 
                 "~/Views/Messaging/{0}.cshtml" 
                }; 

    public CustomRazorViewEngine() 
    { 
     base.ViewLocationFormats = base.ViewLocationFormats.Union(NewViewFormats).ToArray(); 
    } 
} 

public string RenderViewToString(string viewName, object model, ControllerContext controllerContext, 
            string masterName) 
    { 
     if (string.IsNullOrEmpty(viewName)) 

      viewName = controllerContext.RouteData.GetRequiredString("action"); 
     controllerContext.Controller.ViewData.Model = model; 
     using (var stringWriter = new StringWriter()) 
     { 
      ViewEngineResult viewEngineResult = ViewEngines.Engines.FindView(controllerContext, viewName, masterName); 
      var viewContext = new ViewContext(controllerContext, viewEngineResult.View, 
               controllerContext.Controller.ViewData, 
               controllerContext.Controller.TempData, 
               stringWriter); 
      viewEngineResult.View.Render(viewContext, stringWriter); 
      return stringWriter.GetStringBuilder().ToString(); 
     } 
    } 
+0

[msdn](http://msdn.microsoft.com/en-us/library/system.web.mvc.viewenginecollection .findview.aspx)FindControllerは、controllerContextがnullまたはviewNameがnullまたは空の場合にのみ、例外をスローします。 –

+0

ArgumentNullException。 masterNameパラメータがnull以外の場合、追加する可能性のあるCustomView Engineの検索場所はほとんどカスタムではなく、無視されてビューを見つけることができません。 – CrazyCoderz

+0

ViewEngineクラスを表示するために上記のコードを更新しました。 – CrazyCoderz

答えて

1

だから、いくつかのより多くのデバッグの後、私は正解と思われるものを発見しました。最初に、masterNameパラメータがレンダリングされるビューが使用すると言っているように、 "Layout"の名前であることを述べます。ここでキャッチするのは、レイアウトを配置できる必要があるということです。だから私の元の投稿のViewEngineのコードの代わりに、次のコードは必要に応じて動作します。今

public string RenderViewToString(string viewName, object model, ControllerContext controllerContext, 
            string masterName) 
    { 
     if (string.IsNullOrEmpty(viewName)) 

      viewName = controllerContext.RouteData.GetRequiredString("action"); 
     controllerContext.Controller.ViewData.Model = model; 
     using (var stringWriter = new StringWriter()) 
     { 
      ViewEngineResult viewEngineResult = ViewEngines.Engines.FindView(controllerContext, viewName, masterName); 

      var viewContext = new ViewContext(controllerContext, viewEngineResult.View, 
               controllerContext.Controller.ViewData, 
               controllerContext.Controller.TempData, 
               stringWriter); 
      viewEngineResult.View.Render(viewContext, stringWriter); 
      return stringWriter.GetStringBuilder().ToString(); 
     } 
    } 

public class CustomRazorViewEngine : RazorViewEngine 
{ 
    private readonly string[] NewMasterViewFormats = new[] 
                 { 
                  "~/Views/Messaging/Layouts/{0}.cshtml" 
                 }; 

    private readonly string[] NewViewFormats = new[] 
                { 
                 "~/Views/Messaging/{0}.cshtml" 
                }; 

    public CustomRazorViewEngine() 
    { 
     base.ViewLocationFormats = base.ViewLocationFormats.Union(NewViewFormats).ToArray(); 
     base.MasterLocationFormats = base.MasterLocationFormats.Union(NewMasterViewFormats).ToArray(); 
    } 
} 

string returnViewToString = _viewUtils.RenderViewToString("RegistrationEmail", new RegistrationEmailModel 
                       {                      UserName = userName 
                       }, 
                this.ControllerContext,"_RegistrationEmailLayout"); 

すべてを呼び出して幸せであり、それはフォルダに存在する場合、ビューに渡されたため、私のレイアウトが使用されます。これは私の日のハイライトでした... LOL

+0

好奇心の高まりから、 'CustomRazorViewEngine'は何ですか? – Andreas

+0

@ Andreas:デフォルト以外の場所でビューを検索するカスタムクラスを作成したのはかなり明らかです。 –

+0

単に 'return View(viewEngineResult.View);'を実行できませんか? (私は批判していませんが、勉強しようとしています。) – ErikE

関連する問題