/// <summary> /// Renders a partial view to a string in the specified context. /// </summary> /// <param name="partialViewContext">The partial view context.</param> /// <param name="viewModel">The view model.</param> /// <param name="cookies">Any cookies that were captures as part of the response.</param> /// <returns>The view rendered as a string.</returns> public static string ToString(PartialViewContext partialViewContext, object viewModel, out HttpCookieCollection cookies) { string viewName = partialViewContext.ViewName; using (var writer = new StringWriter()) { var httpRequest = new HttpRequest("", "http://www.example.com", ""); var httpResponse = new HttpResponse(writer); // There are still dependencies on HttpContext.Currrent in the ASP.NET (MVC) framework, eg., AntiForgeryRequestToken (as of ASP.NET MVC 4). var httpContext = new HttpContext(httpRequest, httpResponse) { User = partialViewContext.User }; System.Web.HttpContext.Current = httpContext; var controllerContext = CreateControllerContext(httpContext); var viewEngineResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName); if (viewEngineResult == null) { string message = "The partial view was not found."; throw new ArgumentException(message, viewName); } var view = viewEngineResult.View; if (view == null) { var locations = new StringBuilder(); foreach (string searchedLocation in viewEngineResult.SearchedLocations) { locations.AppendLine(); locations.Append(searchedLocation); } throw new ArgumentException("The partial view was not found. The following locations were searched: " + locations, viewName); } try { var viewData = new ViewDataDictionary(viewModel); var tempData = new TempDataDictionary(); var viewContext = new ViewContextStub(controllerContext, view, viewData, tempData, writer) { ClientValidationEnabled = partialViewContext.ClientValidationEnabled, UnobtrusiveJavaScriptEnabled = partialViewContext.UnobtrusiveJavaScriptEnabled }; view.Render(viewContext, httpResponse.Output); cookies = controllerContext.HttpContext.Response.Cookies; httpResponse.Flush(); } finally { viewEngineResult.ViewEngine.ReleaseView(controllerContext, view); } return writer.ToString(); } }
public void Should_be_able_to_post_form_with_anti_forgery_request_token_using_render() { Application.Execute(browser => { const string username = "******"; var context = new PartialViewContext("~/Views/_FormAntiForgeryRequestToken.cshtml").SetFormsAuthPrincipal(username); var payload = new TextBoxPayload { Text = "text" }; var response = browser.Render(context, payload).Submit(ctx => ctx.FormsAuth(username)); Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK)); }); }