C# 如何将ASP.NET MVC ViewResult呈现为HTML?

C# 如何将ASP.NET MVC ViewResult呈现为HTML?,c#,asp.net-mvc,webforms-view-engine,C#,Asp.net Mvc,Webforms View Engine,在测试环境中,我希望能够使用默认的viewEngine将给定的ViewResult呈现为HTML 目前,我的视图是基于WebForms的。但在某个时候,我可能会有火花或剃刀般的观点。现在,我想把重点放在WebForms上。我可以从测试中呈现我的视图吗 这里有一个方法,可以让您将ViewResult呈现为字符串。在您的上下文中使用它唯一棘手的部分是模拟一个可行的ControllerContext static string RenderPartialViewToString(ControllerC

在测试环境中,我希望能够使用默认的viewEngine将给定的ViewResult呈现为HTML


目前,我的视图是基于WebForms的。但在某个时候,我可能会有火花或剃刀般的观点。现在,我想把重点放在WebForms上。我可以从测试中呈现我的视图吗

这里有一个方法,可以让您将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();
        }
    }

您可能需要考虑基于浏览器的测试。通过这种方式,您可以支持测试AJAX或javascript交互。我还通过Selenium进行了基于浏览器的测试。但我正在尝试测试正在呈现的实际HTML/Javascript。非常有用,谢谢。关于这是如何产生的,有什么博客帖子或其他解释吗?@Jon:我刚才用ILSpy查看了
ViewResultBase.ExecuteSult
的功能,并将其修改为使用
StringWriter
而不是请求输出流。(我也必须深入研究
PartialViewResult.FindView
,因为这是一个受保护的方法。
需要。那
语句只是一种简洁的方式,表示
如果(!…)抛出…