Exemple #1
0
        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();
        }
Exemple #2
0
        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();
        }