Как сделать ASP.NET MVC ViewResult в HTML? - PullRequest
3 голосов
/ 20 августа 2011

В тестовой ситуации я хотел бы иметь возможность использовать стандартный viewEngine для визуализации данного ViewResult в HTML.

В настоящее время мои представления основаны на WebForms.Но в какой-то момент у меня могут быть виды Spark или Razor.Сейчас я бы хотел сосредоточиться на WebForms.Могу ли я сделать мои взгляды из теста?

1 Ответ

6 голосов
/ 20 августа 2011

Вот метод, который позволит вам визуализировать ViewResult в строку.Единственная сложность в использовании его в вашем контексте - это создание жизнеспособного ControllerContext.

static string RenderPartialViewToString(ControllerContext context, ViewResultBase partialViewResult)
    {
        Require.ThatArgument(partialViewResult != null);
        Require.That(context != null);
        using (var sw = new StringWriter())
        {
            if (string.IsNullOrEmpty(partialViewResult.ViewName))
            {
                partialViewResult.ViewName = context.RouteData.GetRequiredString("action");
            }
            ViewEngineResult result = null;
            if (partialViewResult.View == null)
            {
                result = partialViewResult.ViewEngineCollection.FindPartialView(context, partialViewResult.ViewName);
                if(result.View == null)
                    throw new InvalidOperationException(
                                   "Unable to find view. Searched in: " +
                                   string.Join(",", result.SearchedLocations));
                partialViewResult.View = result.View;
            }

            var view = partialViewResult.View;
            var viewContext = new ViewContext(context, view, partialViewResult.ViewData,
                                              partialViewResult.TempData, sw);
            view.Render(viewContext, sw);
            if (result != null)
            {
                result.ViewEngine.ReleaseView(context, view);
            }
            return sw.ToString();
        }
    }
...