有关ViewEngines.Engines.FindView方法和masterName参数的问题

时间:2011-09-09 15:29:00

标签: asp.net-mvc asp.net-mvc-3

如果我将null传递给最后一个param masterName,我的类中的视图设置来自RazorViewEngine工作,并且一切都很好,这个方法很有用。出于好奇,masterName参数用于什么?我首先想到的可能是layout.cshtml;当我传递一个布局时,它会抛出一个异常......关于如何使用它的任何想法,它在寻找什么?

自定义视图引擎(很少LOL)

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();
        }
    }

1 个答案:

答案 0 :(得分:1)

经过一些调试后,我发现了正确的答案。首先让我说明masterName参数是“布局”的名称,以便说明正在渲染的视图将使用。这里的问题是必须能够找到布局。因此,代替我原始帖子中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