public void Render(ViewContext viewContext, TextWriter writer) { var wrappedHttpContext = new HttpContextWrapper(viewContext.HttpContext, this); var wrappedViewContext = new ViewContext( new ControllerContext(wrappedHttpContext, viewContext.RouteData, viewContext.Controller), viewContext.View, viewContext.ViewData, viewContext.TempData); ViewContext = wrappedViewContext; ViewData = wrappedViewContext.ViewData; Html = new HtmlHelper(wrappedViewContext, this); Url = new UrlHelper(wrappedViewContext.RequestContext); Ajax = new AjaxHelper(wrappedViewContext, this); var outerView = ViewContext.View as SparkView; var isNestedView = outerView != null && ReferenceEquals(this, outerView) == false; var priorContent = _content; var priorOnce = _once; TextWriter priorContentView = null; if (isNestedView) { // set aside the "view" content, to avoid modification if (outerView._content.TryGetValue("view", out priorContentView)) outerView._content.Remove("view"); // assume the values of the outer view collections _content = outerView._content; _once = outerView._once; } RenderView(writer); if (isNestedView) { _content = priorContent; _once = priorOnce; // restore previous state of "view" content if (priorContentView != null) outerView._content["view"] = priorContentView; else if (outerView._content.ContainsKey("view")) outerView._content.Remove("view"); } else { // proactively dispose named content. pools spoolwriter pages. avoids finalizers. foreach (var content in Content.Values) content.Close(); } Content.Clear(); }
public void Render(ViewContext viewContext, TextWriter writer) { var wrappedHttpContext = new HttpContextWrapper(viewContext.HttpContext, this); var wrappedViewContext = new ViewContext( new ControllerContext(wrappedHttpContext, viewContext.RouteData, viewContext.Controller), viewContext.View, viewContext.ViewData, viewContext.TempData); ViewContext = wrappedViewContext; ViewData = wrappedViewContext.ViewData; Html = new HtmlHelper(wrappedViewContext, this); Url = new UrlHelper(wrappedViewContext.RequestContext); Ajax = new AjaxHelper(wrappedViewContext, this); var outerView = ViewContext.View as SparkView; if (outerView != null && !ReferenceEquals(this, outerView)) { // assume the values of the outer view collections foreach (var kv in outerView.Content) Content.Add(kv.Key, kv.Value); foreach (var kv in outerView._once) _once.Add(kv.Key, kv.Value); } RenderView(writer); if (outerView != null && !ReferenceEquals(this, outerView)) { // inject added values into outer view collections foreach (var kv in Content) { if (!outerView.Content.ContainsKey(kv.Key)) outerView.Content.Add(kv.Key, kv.Value); } foreach (var kv in _once) { if (!outerView._once.ContainsKey(kv.Key)) outerView._once.Add(kv.Key, kv.Value); } } else { // proactively dispose named content. pools spoolwriter pages. avoids finalizers. foreach (var content in Content.Values) content.Close(); } Content.Clear(); }