Вопрос о методе ViewEngines.Engines.FindView и параметре masterName - PullRequest
1 голос
/ 09 сентября 2011

Этот метод отлично работает, если я передаю null последнему параметру masterName, настройки моего представления в моем классе получены из RazorViewEngine, и все хорошо.Из любопытства, для чего используется параметр masterName?Сначала я подумал, что, возможно, это было для layout.cshtml;когда я передаю его в макет, он выдает исключение .... Любые идеи о том, как это предполагается использовать, что он ищет?

1 Ответ

1 голос
/ 09 сентября 2011

Итак, после некоторой дополнительной отладки я нашел правильный ответ. Сначала позвольте мне заявить, что параметр 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...