public bool CollectTemplateData(long id)
        {
            PageCategory p = _unit.PageCategoryRepository.FindSingle(id);

            if (p == null)
            {
                throw new Exception("Not Found");
            }

            Out.Write(p.ViewPath);
            GotoColumn(6);
            Out.Write(" View Data: ");
            TemplateDataCollector dto = GetCollector(p.Id);

            if (dto == null)
            {
                WriteFailed();
                return(false);
            }
            WriteSuccess();
            Out.Write(" Controls: ");
            _controls.UpdateTemplateControls(p, dto.Controls);
            _controls.DeleteUnusedControls(p, dto.Controls);
            _categories.UpdateParameters(p, dto.Parameters);
            if (!string.IsNullOrEmpty(_paths.LocalizationRoot))
            {
                _loc.UpdateFiles(dto.Localization);
            }
            WriteSuccess();
            return(true);
        }
        public TemplateDataCollector GetCollector(HttpContext context, string viewName, string layout = null)
        {
            ActionContext actionContext = new ActionContext(context, new RouteData(), new ActionDescriptor());

            using (var sw = new StringWriter())
            {
                var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);

                if (viewResult.View == null)
                {
                    throw new Exception($"{viewName} does not match any available view");
                }

                var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary());

                viewDictionary["CollectViewData"] = true;
                viewDictionary["PageControls"]    = new TemplateDataCollector
                {
                    EntityName = null,
                    Controls   = new List <ControlDTO>()
                };
                viewDictionary["LocalizationDataCollector"] = new LocalizationDataCollector();


                if (layout != null)
                {
                    viewDictionary["PageOptions"] = new PageOptions
                    {
                        Layout = layout
                    };
                }

                var viewContext = new ViewContext(
                    actionContext,
                    viewResult.View,
                    viewDictionary,
                    new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
                    sw,
                    new HtmlHelperOptions()
                    );

                var t = RenderAsync(viewResult, viewContext);
                t.Wait();
                if (t.Result.Code != 200)
                {
                    throw new CodeShellHttpException(t.Result);
                }

                var data = (TemplateDataCollector)viewContext.ViewData["PageControls"];
                data.Localization = ((LocalizationDataCollector)viewContext.ViewData["LocalizationDataCollector"]);
                data.Localization.Unify();
                return(data);
            }
        }