Example #1
0
        /// <summary>
        /// Processes the specified args.
        /// </summary>
        /// <param name="args">The args.</param>
        public override void Process(GetModelArgs args)
        {
            if (args.Result != null)
            {
                return;
            }

            Rendering rendering = args.Rendering;
            if (rendering.RenderingType == "Layout")
            {
                args.Result = GetFromItem(rendering, args);
                if (args.Result == null)
                {
                    args.Result = GetFromLayout(rendering, args);
                }
            }
            if (args.Result == null)
            {
                args.Result = GetFromPropertyValue(rendering, args);
            }
            if (args.Result == null)
            {
                args.Result = GetFromField(rendering, args);
            }
            if (args.Result != null)
            {
                args.AbortPipeline();
            }
        }
Example #2
0
        public override void Process(GetModelArgs args)
        {
            if (args.Result != null)
                return;

            if (args.Rendering.RenderingType != "Layout" && args.Rendering.RenderingType != "View" && args.Rendering.RenderingType != "r" && args.Rendering.RenderingType != "d")
                return;

            var viewRenderer = args.Rendering.Renderer as ViewRenderer;
            if (viewRenderer == null)
                return;

            var compiledViewType = BuildManager.GetCompiledType(viewRenderer.ViewPath);
            var baseType = compiledViewType.BaseType;

            if (baseType == null || !baseType.IsGenericType)
                return;

            var modelType = baseType.GetGenericArguments()[0];

            if (modelType == typeof(object))
                return;

            args.Result = Activator.CreateInstance(modelType);
        }
        public override void Process(GetModelArgs args)
        {
            if (args.Result == null)
            {

                try
                {
                    Type type = GetFromField(args.Rendering, args);
                    if (Context.StaticContext.Classes.ContainsKey(type))
                    {
                        ISitecoreContext context = new SitecoreContext();
                        var result = context.GetCurrentItem(type);
                        args.Result = result;
                    }
                }
                catch (MapperException ex)
                {
                    //do nothing
                }
                catch (System.TypeLoadException ex)
                {
                    //do nothing
                }
            }
        }
Example #4
0
        private object CreateResult(IEnumerable <Rendering> renderings)
        {
            var args = new GetModelArgs(renderings);

            CorePipeline.Run("headless.getModel", args, false);
            return(args.Result);
        }
Example #5
0
        public override void Process(GetModelArgs args)
        {
            if (args.Result != null)
                return;

            if (args.Rendering.RenderingType != "Layout" && args.Rendering.RenderingType != "View" && args.Rendering.RenderingType != "r" && args.Rendering.RenderingType != "d")
                return;

            var viewRenderer = args.Rendering.Renderer as ViewRenderer;
            if (viewRenderer == null)
                return;

            var compiledViewType = BuildManager.GetCompiledType(viewRenderer.ViewPath);
            var baseType = compiledViewType.BaseType;

            if (baseType == null || !baseType.IsGenericType)
                return;

            var modelType = baseType.GetGenericArguments()[0];

            if (modelType == typeof(object))
                return;

            args.Result = Activator.CreateInstance(modelType);
        }
Example #6
0
 public override void Process(GetModelArgs args)
 {
     if (args.Result == null)
     {
         args.Result = GetFromViewPath(args.Rendering, args);
     }
 }
Example #7
0
        protected virtual Type GetModelVromViewPath(Rendering rendering, GetModelArgs args)
        {
            string path = rendering.Renderer is ViewRenderer
                ? ((ViewRenderer)rendering.Renderer).ViewPath
                : rendering.ToString().Replace("View: ", string.Empty);

            if (string.IsNullOrEmpty(path))
            {
                return(null);
            }

            Type compiledType = BuildManager.GetCompiledType(path);
            Type baseType     = compiledType.BaseType;

            // check if base type is null or generic
            if (baseType == null || !baseType.IsGenericType)
            {
                return(null);
            }

            Type modelType = baseType.GetGenericArguments()[0];

            // check if no model has been set
            if (modelType == typeof(object))
            {
                return(null);
            }

            return(modelType);
        }
Example #8
0
        /// <summary>
        /// Processes the specified args.
        /// </summary>
        /// <param name="args">The args.</param>
        public override void Process(GetModelArgs args)
        {
            if (args.Result != null)
            {
                return;
            }

            Rendering rendering = args.Rendering;

            if (rendering.RenderingType == "Layout")
            {
                args.Result = GetFromItem(rendering, args);
                if (args.Result == null)
                {
                    args.Result = GetFromLayout(rendering, args);
                }
            }
            if (args.Result == null)
            {
                args.Result = GetFromPropertyValue(rendering, args);
            }
            if (args.Result == null)
            {
                args.Result = GetFromField(rendering, args);
            }
            if (args.Result != null)
            {
                args.AbortPipeline();
            }
        }
        protected virtual object GetFromViewPath(Rendering rendering, GetModelArgs args)
        {
            var viewPath = rendering.ToString().Replace("View: ", string.Empty);

            if(!SiteHelper.IsValidSite()) return null;

            var useSynthesisModelType = SynthesisRenderingCache.GetOrAdd(rendering.ToString(), key =>
            {
                var renderer = rendering.Renderer;

                var diagnosticRenderer = renderer as RenderingDiagnosticsInjector.DiagnosticsRenderer;
                if (diagnosticRenderer != null) renderer = diagnosticRenderer.InnerRenderer;

                var viewRenderer = renderer as ViewRenderer;
                if (viewRenderer != null) viewPath = viewRenderer.ViewPath;

                var modelType = _typeResolver.GetViewModelType(viewPath);

                // Check to see if no model has been set
                if (modelType == typeof(object)) return false;

                // Check that the model is a Synthesis type (if not, we ignore it)
                if (!typeof(IStandardTemplateItem).IsAssignableFrom(modelType)) return false;

                return true;
            });

            return useSynthesisModelType ? rendering.Item.AsStronglyTyped() : null;
        }
Example #10
0
        public override void Process(GetModelArgs args)
        {
            if (args.Result != null)
            {
                return;
            }

            Type modelType = this.GetModelVromViewPath(args.Rendering, args);

            if (modelType == null || !typeof(IGlassBase).IsAssignableFrom(modelType))
            {
                return;
            }


            var        sitecoreContext = this.SitecoreContext();
            IGlassBase createdInstance = GetInstanceFromContext(args.Rendering, sitecoreContext);

            if (modelType.IsInstanceOfType(createdInstance))
            {
                args.Result = createdInstance;
            }

            // else if model type is not type of created instance.

            args.AbortPipeline();
        }
Example #11
0
        public override void Process(GetModelArgs args)
        {
            var currentViewContext = Sitecore.Mvc.Common.ContextService.Get().GetCurrent <System.Web.Mvc.ViewContext>();

            if (currentViewContext.ViewData.Model == null)
            {
                return;
            }

            if (!(currentViewContext.Controller is StandardController))
            {
                return;
            }

            var controller = currentViewContext.Controller as StandardController;

            if (controller.Model == null || !(controller.Model is IRenderingModel))
            {
                return;
            }

            if (args.Result == null)
            {
                return;
            }

            if (args.Result.GetType().FullName == controller.Model.GetType().FullName)
            {
                args.Result = controller.Model;
            }
        }
Example #12
0
 public override void Process(GetModelArgs args)
 {
     if (args.Result == null)
     {
         args.Result = GetFromViewPath(args.Rendering, args);
     }
 }
Example #13
0
        public override void Process(GetModelArgs args)
        {
            if (args.Result == null)
            {
                try
                {
                    Type type = GetFromField(args.Rendering, args);

                    if (type == null)
                    {
                        return;
                    }

                    if (Context.StaticContext.Classes.ContainsKey(type))
                    {
                        ISitecoreContext context = new SitecoreContext();
                        var result = context.GetCurrentItem(type);
                        args.Result = result;
                    }
                }
                catch (MapperException ex)
                {
                    //do nothing
                }
                catch (System.TypeLoadException ex)
                {
                    //do nothing
                }
            }
        }
Example #14
0
        /// <summary>
        /// Processes the specified args.
        /// </summary>
        /// <param name="args">The args.</param>
        public override void Process(GetModelArgs args)
        {
            Sitecore.Diagnostics.Log.Debug("Glass GetModel Process " + ContextName, this);

            if (args.Result == null)
            {
                Rendering rendering = args.Rendering;
                if (rendering.RenderingType == "Layout")
                {
                    args.Result = GetFromItem(rendering, args);
                    if (args.Result == null)
                    {
                        args.Result = GetFromLayout(rendering, args);
                    }
                }
                if (args.Result == null)
                {
                    args.Result = GetFromPropertyValue(rendering, args);
                }
                if (args.Result == null)
                {
                    args.Result = GetFromField(rendering, args);
                }
                if (args.Result != null)
                {
                    args.AbortPipeline();
                }
            }
        }
Example #15
0
        protected virtual string GetViewPath(GetModelArgs args)
        {
            var rendering = args.Rendering;

            return(rendering.Renderer is ViewRenderer
                                ? ((ViewRenderer)rendering.Renderer).ViewPath
                                : rendering.ToString().Replace("View: ", string.Empty));
        }
 public override void Process(GetModelArgs args)
 {
   if (args.Result != null)
     return;
   
   Rendering = args.Rendering;
   args.Result = GetModelFromField();
 }
Example #17
0
 protected virtual object GetFromItem(Rendering rendering, GetModelArgs args)
 {
     string model = ObjectExtensions.ValueOrDefault<Item, string>(rendering.Item, (Func<Item, string>)(i => i["MvcLayoutModel"]));
     if (StringExtensions.IsWhiteSpaceOrNull(model))
         return (object) null;
     else
         return GetObject(model);
 }
Example #18
0
 protected virtual object GetFromPropertyValue(Rendering rendering, GetModelArgs args)
 {
     string model = rendering.Properties["Model"];
     if (StringExtensions.IsWhiteSpaceOrNull(model))
         return (object)null;
     else
         return GetObject(model);
 }
 protected virtual Type GetFromField(Rendering rendering, GetModelArgs args)
 {
     Item obj = ObjectExtensions.ValueOrDefault<RenderingItem, Item>(rendering.RenderingItem, (Func<RenderingItem, Item>)(i => i.InnerItem));
     if (obj == null)
         throw new MapperException("No rendering item");
     else
         return Type.GetType(obj["Model"], true);
 }
Example #20
0
 protected virtual object GetFromField(Rendering rendering, GetModelArgs args)
 {
     Item obj = ObjectExtensions.ValueOrDefault<RenderingItem, Item>(rendering.RenderingItem, (Func<RenderingItem, Item>)(i => i.InnerItem));
     if (obj == null)
         return (object)null;
     else
         return GetObject(obj["Model"]);
 }
Example #21
0
        public override void Process(GetModelArgs args)
        {
            if (this.IsValidView(args) == false)
            {
                return;
            }

            args.Result = this.GetFromViewPath(args.Rendering, args);
        }
        protected virtual string GetViewPath(GetModelArgs args)
        {
            string path = args.Rendering.RenderingItem.InnerItem["path"];

            if (string.IsNullOrWhiteSpace(path) && args.Rendering.RenderingType == "Layout")
            {
                path = GetPathFromLayout(args.PageContext.Database, new ID(args.Rendering.LayoutId));
            }
            return(path);
        }
        public override void Process(GetModelArgs args)
        {
            if (args.Result != null)
            {
                return;
            }

            Rendering   = args.Rendering;
            args.Result = GetModelFromField();
        }
        public override void Process(GetModelArgs args)
        {
            var key   = "GetModelFromView";
            var watch = Stopwatch.StartNew();

            try
            {
                if (!IsValidForProcessing(args))
                {
                    return;
                }

                string path = GetViewPath(args);

                if (string.IsNullOrWhiteSpace(path))
                {
                    return;
                }

                string cacheKey  = modelCacheManager.GetKey(path);
                Type   modelType = modelCacheManager.Get(cacheKey);

                if (modelType == typeof(NullModel))
                {
                    // The model has been attempted before and is not useful
                    return;
                }

                // The model type hasn't been found before or has been cleared.
                if (modelType == null)
                {
                    modelType = GetModel(args, path);

                    if (typeof(RenderingModel).IsAssignableFrom(modelType))
                    {
                        //convert RenderingModel to NullModel so it is ignored in the future.
                        modelType = typeof(NullModel);
                    }

                    modelCacheManager.Add(cacheKey, modelType);

                    if (modelType == typeof(NullModel))
                    {
                        // This is not the type we are looking for
                        return;
                    }
                }

                args.Result = GetDataSourceItem(args, modelType);
            }
            finally
            {
                Sitecore.Diagnostics.Log.Debug("GetModelFromView {0} {1}".Formatted(watch.ElapsedMilliseconds, args.Rendering.RenderingItem.ID), this);
            }
        }
        public override void Process(GetModelArgs args)
        {
            var currentViewContext = Sitecore.Mvc.Common.ContextService.Get().GetCurrent<System.Web.Mvc.ViewContext>();

            if (currentViewContext.ViewData.Model == null) return;

            if (currentViewContext.ViewData.Model is IRenderingModel)
            {
                args.Result = currentViewContext.ViewData.Model;
            }
        }
Example #26
0
        /// <summary>
        /// Gets model from view path.
        /// </summary>
        /// <param name="rendering">The rendering.</param>
        /// <param name="args">The arguments.</param>
        /// <returns></returns>
        protected virtual object GetFromViewPath(Rendering rendering, GetModelArgs args)
        {
            try
            {
                var path = rendering.Renderer is ViewRenderer renderer
                                        ? renderer.ViewPath
                                        : rendering.ToString().Replace("View: ", string.Empty);

                if (string.IsNullOrWhiteSpace(path))
                {
                    return(null);
                }

                // Retrieve the compiled view
                var compiledViewType = BuildManager.GetCompiledType(path);
                var baseType         = compiledViewType.BaseType;


                // Check to see if the view has been found and that it is a generic type
                if (baseType == null || !baseType.IsGenericType)
                {
                    return(null);
                }

                var modelType        = baseType.GetGenericArguments()[0];
                var viewModelFactory = ViewModelFactory.Instance;

                // Check to see if no model has been set
                if (modelType.IsAssignableTo(typeof(IViewModel)))
                {
                    return(viewModelFactory.GetViewModel());
                }

                if (modelType.IsAssignableTo(typeof(IViewModel <ItemWrapper>)) ||
                    modelType.IsAssignableTo(typeof(IViewModel <ItemWrapper, RenderingParametersWrapper>)))
                {
                    var modelGenericArgs = modelType.GetGenericArguments();

                    var method = typeof(ViewModelFactory).GetMethods().FirstOrDefault(m =>
                                                                                      string.Equals(m.Name, "GetViewModel") &&
                                                                                      m.GetGenericArguments().Length.Equals(modelGenericArgs.Length));

                    var genericMethod = method?.MakeGenericMethod(modelGenericArgs);

                    return(genericMethod?.Invoke(viewModelFactory, null));
                }

                return(null);
            }
            catch
            {
                return(null);
            }
        }
Example #27
0
        /// <summary>
        /// Gets from item.
        /// </summary>
        /// <param name="rendering">The rendering.</param>
        /// <param name="args">The args.</param>
        /// <returns></returns>
        protected virtual object GetFromItem(Rendering rendering, GetModelArgs args)
        {
            string model = rendering.Item.ValueOrDefault(i => i["MvcLayoutModel"]);

            if (model.IsWhiteSpaceOrNull())
            {
                return(null);
            }

            return(GetObject(model, rendering.Item.Database, rendering));
        }
Example #28
0
 protected virtual object GetFromLayout(Rendering rendering, GetModelArgs args)
 {
     string pathOrId = rendering.Properties["LayoutId"];
     if (StringExtensions.IsWhiteSpaceOrNull(pathOrId))
         return (object)null;
     string model = ObjectExtensions.ValueOrDefault<Item, string>(MvcSettings.GetRegisteredObject<ItemLocator>().GetItem(pathOrId), (Func<Item, string>)(i => i["Model"]));
     if (StringExtensions.IsWhiteSpaceOrNull(model))
         return (object) null;
     else
         return GetObject(model);
 }
Example #29
0
        /// <summary>
        /// Gets from field.
        /// </summary>
        /// <param name="rendering">The rendering.</param>
        /// <param name="args">The args.</param>
        /// <returns></returns>
        protected virtual object GetFromField(Rendering rendering, GetModelArgs args)
        {
            Item obj = rendering.RenderingItem.ValueOrDefault(i => i.InnerItem);

            if (obj == null)
            {
                return(null);
            }
            return(rendering.Item == null
                ? null
                : GetObject(obj[ModelField], rendering.Item.Database, rendering));
        }
Example #30
0
        protected virtual Type GetFromField(Rendering rendering, GetModelArgs args)
        {
            Item obj = ObjectExtensions.ValueOrDefault <RenderingItem, Item>(rendering.RenderingItem, (Func <RenderingItem, Item>)(i => i.InnerItem));

            if (obj == null)
            {
                throw new MapperException("No rendering item");
            }
            else
            {
                return(Type.GetType(obj["Model"], true));
            }
        }
Example #31
0
        public override void Process(GetModelArgs args)
        {
            //See if someone else chose a model
            if (args.Result == null)
            {
                args.Result = ModelFactory.Model <BaseEntity>(args.Rendering.Item, false);

                if (args.Result != null)
                {
                    Tracer.Info(string.Format("Bound model {0} to item {1}", args.Result.GetType().FullName, args.Rendering.Item.ID));
                }
            }
        }
Example #32
0
        protected virtual object GetFromField(Rendering rendering, GetModelArgs args)
        {
            Item obj = ObjectExtensions.ValueOrDefault <RenderingItem, Item>(rendering.RenderingItem, (Func <RenderingItem, Item>)(i => i.InnerItem));

            if (obj == null)
            {
                return((object)null);
            }
            else
            {
                return(GetObject(obj["Model"]));
            }
        }
Example #33
0
        protected virtual object GetFromPropertyValue(Rendering rendering, GetModelArgs args)
        {
            string model = rendering.Properties["Model"];

            if (StringExtensions.IsWhiteSpaceOrNull(model))
            {
                return((object)null);
            }
            else
            {
                return(GetObject(model));
            }
        }
Example #34
0
        /// <summary>
        /// Gets from property value.
        /// </summary>
        /// <param name="rendering">The rendering.</param>
        /// <param name="args">The args.</param>
        /// <returns></returns>
        protected virtual object GetFromPropertyValue(Rendering rendering, GetModelArgs args)
        {
            string model = rendering.Properties[ModelField];

            if (model.IsWhiteSpaceOrNull())
            {
                return(null);
            }
            else
            {
                return(GetObject(model, rendering.Item.Database, rendering));
            }
        }
        public override void Process(GetModelArgs args)
        {
            //See if someone else chose a model
            if (args.Result == null)
            {
                args.Result = ModelFactory.Model<BaseEntity>(args.Rendering.Item, false);

                if (args.Result != null)
                {
                    Tracer.Info(string.Format("Bound model {0} to item {1}", args.Result.GetType().FullName, args.Rendering.Item.ID));
                }
            }
        }
Example #36
0
        protected virtual object GetFromItem(Rendering rendering, GetModelArgs args)
        {
            string model = ObjectExtensions.ValueOrDefault <Item, string>(rendering.Item, (Func <Item, string>)(i => i["MvcLayoutModel"]));

            if (StringExtensions.IsWhiteSpaceOrNull(model))
            {
                return((object)null);
            }
            else
            {
                return(GetObject(model));
            }
        }
Example #37
0
        public override void Process(GetModelArgs args)
        {
            var currentViewContext = Sitecore.Mvc.Common.ContextService.Get().GetCurrent <System.Web.Mvc.ViewContext>();

            if (currentViewContext.ViewData.Model == null)
            {
                return;
            }

            if (currentViewContext.ViewData.Model is IRenderingModel)
            {
                args.Result = currentViewContext.ViewData.Model;
            }
        }
Example #38
0
        /// <summary>
        /// Processes the specified arguments.
        /// </summary>
        /// <param name="args">The arguments.</param>
        public override void Process(GetModelArgs args)
        {
            if (args.Rendering.Item == null ||
                args.Result == null ||
                args.Result is RenderingModel)
            {
                return;
            }
            HighResTimer timer = new HighResTimer(true);

            args.Rendering.Item.Project(args.Result);

            var elapsed = timer.ElapsedTimeSpan.Milliseconds;

            Log.Info("elapsed:" + elapsed, this);
            timer.Stop();
        }
Example #39
0
        protected virtual bool IsValidForProcessing(GetModelArgs args)
        {
            if (args.Result != null)
            {
                return(false);
            }

            if (!String.IsNullOrEmpty(args.Rendering.RenderingItem.InnerItem["Model"]))
            {
                return(false);
            }

            return(args.Rendering.RenderingType == "Layout" ||
                   args.Rendering.RenderingType == "View" ||
                   args.Rendering.RenderingType == "r" ||
                   args.Rendering.RenderingType == String.Empty);
        }
Example #40
0
        protected virtual object GetFromViewPath(Rendering rendering, GetModelArgs args)
        {
            var path = this.GetViewPath(args);

            if (string.IsNullOrWhiteSpace(path))
            {
                return(null);
            }

            var filePath = HttpContext.Current.Server.MapPath(path);

            if (File.Exists(filePath) == false)
            {
                return(false);
            }

            // Retrieve the compiled view
            var compiledViewType = BuildManager.GetCompiledType(path);
            var baseType         = compiledViewType.BaseType;

            // Check to see if the view has been found and that it is a generic type
            if (baseType == null || !baseType.IsGenericType)
            {
                return(null);
            }

            var modelType = baseType.GetGenericArguments()[0];

            // Check to see if no model has been set
            if (modelType == typeof(object))
            {
                return(null);
            }

            var modelGenericArgs = modelType.GetGenericArguments();

            var itemFactory = DependencyResolver.Current.GetService <IItemFactory>();

            var method = itemFactory.GetType().GetMethods().FirstOrDefault(m => string.Equals(m.Name, "GetRenderingContextItems") &&
                                                                           m.GetGenericArguments().Count().Equals(modelGenericArgs.Count()));

            var genericMethod = method?.MakeGenericMethod(modelGenericArgs);

            return(genericMethod?.Invoke(itemFactory, new object[] { itemFactory }));
        }
Example #41
0
        protected virtual object GetFromViewPath(Rendering rendering, GetModelArgs args)
        {
            var viewPath = rendering.ToString().Replace("View: ", string.Empty);

            if (!SiteHelper.IsValidSite())
            {
                return(null);
            }

            var useSynthesisModelType = SynthesisRenderingCache.GetOrAdd(rendering.ToString(), key =>
            {
                var renderer = rendering.Renderer;

                var diagnosticRenderer = renderer as RenderingDiagnosticsInjector.DiagnosticsRenderer;
                if (diagnosticRenderer != null)
                {
                    renderer = diagnosticRenderer.InnerRenderer;
                }

                var viewRenderer = renderer as ViewRenderer;
                if (viewRenderer != null)
                {
                    viewPath = viewRenderer.ViewPath;
                }

                var modelType = _typeResolver.GetViewModelType(viewPath);

                // Check to see if no model has been set
                if (modelType == typeof(object))
                {
                    return(false);
                }

                // Check that the model is a Synthesis type (if not, we ignore it)
                if (!typeof(IStandardTemplateItem).IsAssignableFrom(modelType))
                {
                    return(false);
                }

                return(true);
            });

            return(useSynthesisModelType ? rendering.Item.AsStronglyTyped() : null);
        }
Example #42
0
        /// <summary>
        /// Gets from layout.
        /// </summary>
        /// <param name="rendering">The rendering.</param>
        /// <param name="args">The args.</param>
        /// <returns></returns>
        protected virtual object GetFromLayout(Rendering rendering, GetModelArgs args)
        {
            string pathOrId = rendering.Properties["LayoutId"];

            if (pathOrId.IsWhiteSpaceOrNull())
            {
                return(null);
            }
            string model = MvcSettings.GetRegisteredObject <ItemLocator>().GetItem(pathOrId).ValueOrDefault(i => i["Model"]);

            if (model.IsWhiteSpaceOrNull())
            {
                return(null);
            }
            else
            {
                return(GetObject(model, rendering.Item.Database, rendering));
            }
        }
Example #43
0
        protected virtual object GetFromLayout(Rendering rendering, GetModelArgs args)
        {
            string pathOrId = rendering.Properties["LayoutId"];

            if (StringExtensions.IsWhiteSpaceOrNull(pathOrId))
            {
                return((object)null);
            }
            string model = ObjectExtensions.ValueOrDefault <Item, string>(MvcSettings.GetRegisteredObject <ItemLocator>().GetItem(pathOrId), (Func <Item, string>)(i => i["Model"]));

            if (StringExtensions.IsWhiteSpaceOrNull(model))
            {
                return((object)null);
            }
            else
            {
                return(GetObject(model));
            }
        }
Example #44
0
        protected virtual object GetFromViewPath(Rendering rendering, GetModelArgs args)
        {
            var path = rendering.Renderer is ViewRenderer ? ((ViewRenderer)rendering.Renderer).ViewPath : rendering.ToString().Replace("View: ", string.Empty);

            if (string.IsNullOrWhiteSpace(path))
            {
                return null;
            }

            // Retrieve the compiled view
            var compiledViewType = BuildManager.GetCompiledType(path);
            var baseType = compiledViewType.BaseType;

            // Check to see if the view has been found and that it is a generic type
            if (baseType == null || !baseType.IsGenericType)
            {
                return null;
            }

            var modelType = baseType.GetGenericArguments()[0];

            // Check to see if no model has been set
            if (modelType == typeof(object))
            {
                return null;
            }

            var modelGenericArgs = modelType.GetGenericArguments();

            var itemFactory = DependencyResolver.Current.GetService<IItemFactory>();

            var method = itemFactory.GetType().GetMethods().FirstOrDefault(m => string.Equals(m.Name, "GetRenderingContextItems")
                && m.GetGenericArguments().Count().Equals(modelGenericArgs.Count()));

            if (method != null)
            {
                var genericMethod = method.MakeGenericMethod(modelGenericArgs);

                return genericMethod.Invoke(itemFactory, new object[] { itemFactory });
            }

            return null;
        }
        public override void Process(GetModelArgs args)
        {
            var currentViewContext = Sitecore.Mvc.Common.ContextService.Get().GetCurrent<System.Web.Mvc.ViewContext>();

            if (currentViewContext.ViewData.Model == null) return;

            if (!(currentViewContext.Controller is StandardController)) return;

            var controller = currentViewContext.Controller as StandardController;

            if (controller.Model == null || !(controller.Model is IRenderingModel)) return;

            if (args.Result == null) return;

            if (args.Result.GetType().FullName == controller.Model.GetType().FullName)
            {
                args.Result = controller.Model;
            }
        }
        public override void Process(GetModelArgs args)
        {
            if (!IsValidForProcessing(args))
            {
                return;
            }

            string path = GetViewPath(args);

            if (string.IsNullOrWhiteSpace(path))
            {
                return;
            }

            string cacheKey = modelCacheManager.GetKey(path);
            Type modelType = modelCacheManager.Get(cacheKey);

            if (modelType == typeof(NullModel))
            {
                // The model has been attempted before and is not useful
                return;
            }

            // The model type hasn't been found before or has been cleared.
            if (modelType == null)
            {
                modelType = GetModel(args, path);

                modelCacheManager.Add(cacheKey, modelType);

                if (modelType == typeof(NullModel))
                {
                    // This is not the type we are looking for
                    return;
                }
            }

            ISitecoreContext scContext = SitecoreContext.GetFromHttpContext(ContextName);

            Rendering renderingItem = args.Rendering;

            object model = null;

            if (renderingItem.DataSource.HasValue())
            {
                var item = scContext.Database.GetItem(renderingItem.DataSource);
                model = scContext.CreateType(modelType, item, false, false, null);
            }
            else if (renderingItem.RenderingItem.DataSource.HasValue())
            {
                var item = scContext.Database.GetItem(renderingItem.RenderingItem.DataSource);
                model = scContext.CreateType(modelType, item, false, false, null);
            }
            else if (renderingItem.Item != null)
            {   
                /**
             * Issues #82:
             * Check Item before defaulting to the current item.
             */
                model = scContext.CreateType(modelType, renderingItem.Item, false, false, null);
            }
            else
            {
                model = scContext.GetCurrentItem(modelType);
            }

            args.Result = model;
        }
        private static bool IsValidForProcessing(GetModelArgs args)
        {
            if (args.Result != null)
            {
                return false;
            }

            if (!String.IsNullOrEmpty(args.Rendering.RenderingItem.InnerItem["Model"]))
            {
                return false;
            }

            return args.Rendering.RenderingType == "Layout" ||
                   args.Rendering.RenderingType == "View" ||
                   args.Rendering.RenderingType == "r" ||
                   args.Rendering.RenderingType == String.Empty;
        }
        private Type GetModel(GetModelArgs args, string path)
        {
            Type compiledViewType = BuildManager.GetCompiledType(path);
            Type baseType = compiledViewType.BaseType;

            if (baseType == null || !baseType.IsGenericType)
            {
                Log.Error(string.Format(
                    "View {0} compiled type {1} base type {2} does not have a single generic argument.",
                    args.Rendering.RenderingItem.InnerItem["path"],
                    compiledViewType,
                    baseType), this);
                return typeof(NullModel);
            }

            Type proposedType = baseType.GetGenericArguments()[0];
            return proposedType == typeof(object)
                ? typeof(NullModel)
                : proposedType;
        }
        private string GetViewPath(GetModelArgs args)
        {
            string path = args.Rendering.RenderingItem.InnerItem["path"];

            if (string.IsNullOrWhiteSpace(path) && args.Rendering.RenderingType == "Layout")
            {
                path = GetPathFromLayout(args.PageContext.Database, new ID(args.Rendering.LayoutId));
            }
            return path;
        }
        protected virtual bool IsValidForProcessing(GetModelArgs args)
        {
            if (args.Result != null)
            {
                return false;
            }
            if (Sitecore.Context.Site != null && Sitecore.Context.Site.Name.ToLowerInvariant() == "shell")
            {
                return false;
            }

            if (!String.IsNullOrEmpty(args.Rendering.RenderingItem.InnerItem["Model"]))
            {
                return false;
            }

            return args.Rendering.RenderingType == "Layout" ||
                   args.Rendering.RenderingType == "View" ||
                   args.Rendering.RenderingType == "r" ||
                   args.Rendering.RenderingType == String.Empty;
        }
 protected virtual Type GetModel(GetModelArgs args, string path)
 {
     return ViewTypeResolver.GetType(path);
 }
Example #52
0
 /// <summary>
 /// Gets from field.
 /// </summary>
 /// <param name="rendering">The rendering.</param>
 /// <param name="args">The args.</param>
 /// <returns></returns>
 protected virtual object GetFromField(Rendering rendering, GetModelArgs args)
 {
     Item obj = ObjectExtensions.ValueOrDefault<RenderingItem, Item>(rendering.RenderingItem, (Func<RenderingItem, Item>)(i => i.InnerItem));
     if (obj == null)
         return (object)null;
     else if (rendering.Item == null)
     {
         return null;
     }
     else
     {
         return GetObject(obj[ModelField], rendering.Item.Database, rendering);
     }
 }
Example #53
0
        /// <summary>
        /// Gets from item.
        /// </summary>
        /// <param name="rendering">The rendering.</param>
        /// <param name="args">The args.</param>
        /// <returns></returns>
        protected virtual object GetFromItem(Rendering rendering, GetModelArgs args)
        {
            string model = rendering.Item.ValueOrDefault(i => i["MvcLayoutModel"]);
            if (model.IsWhiteSpaceOrNull())
                return null;

            return GetObject(model, rendering.Item.Database, rendering);
        }
Example #54
0
 /// <summary>
 /// Gets from layout.
 /// </summary>
 /// <param name="rendering">The rendering.</param>
 /// <param name="args">The args.</param>
 /// <returns></returns>
 protected virtual object GetFromLayout(Rendering rendering, GetModelArgs args)
 {
     string pathOrId = rendering.Properties["LayoutId"];
     if (pathOrId.IsWhiteSpaceOrNull())
         return null;
     string model = MvcSettings.GetRegisteredObject<ItemLocator>().GetItem(pathOrId).ValueOrDefault(i => i["Model"]);
     if (model.IsWhiteSpaceOrNull())
         return null;
     else
         return GetObject(model, rendering.Item.Database, rendering);
 }
Example #55
0
 /// <summary>
 /// Gets from property value.
 /// </summary>
 /// <param name="rendering">The rendering.</param>
 /// <param name="args">The args.</param>
 /// <returns></returns>
 protected virtual object GetFromPropertyValue(Rendering rendering, GetModelArgs args)
 {
     string model = rendering.Properties[ModelField];
     if (model.IsWhiteSpaceOrNull())
         return null;
     else
         return GetObject(model, rendering.Item.Database, rendering);
 }
Example #56
0
 /// <summary>
 /// Gets from field.
 /// </summary>
 /// <param name="rendering">The rendering.</param>
 /// <param name="args">The args.</param>
 /// <returns></returns>
 protected virtual object GetFromField(Rendering rendering, GetModelArgs args)
 {
     Item obj = rendering.RenderingItem.ValueOrDefault(i => i.InnerItem);
     if (obj == null)
         return null;
     return rendering.Item == null 
         ? null 
         : GetObject(obj[ModelField], rendering.Item.Database, rendering);
 }
        public override void Process(GetModelArgs args)
        {
            var key = "GetModelFromView";
            var watch = Stopwatch.StartNew();

            try
            {
                if (!IsValidForProcessing(args))
                {
                    return;
                }

                string path = GetViewPath(args);

                if (string.IsNullOrWhiteSpace(path))
                {
                    return;
                }

                string cacheKey = modelCacheManager.GetKey(path);
                Type modelType = modelCacheManager.Get(cacheKey);

                if (modelType == typeof(NullModel))
                {
                    // The model has been attempted before and is not useful
                    return;
                }

                // The model type hasn't been found before or has been cleared.
                if (modelType == null)
                {
                    modelType = GetModel(args, path);

                    modelCacheManager.Add(cacheKey, modelType);

                    if (modelType == typeof(NullModel))
                    {
                        // This is not the type we are looking for
                        return;
                    }
                }

                ISitecoreContext scContext = SitecoreContextFactory.GetSitecoreContext();

                Rendering renderingItem = args.Rendering;

                object model = null;

                if (renderingItem.DataSource.HasValue())
                {
                    var item = scContext.Database.GetItem(renderingItem.DataSource);
                    model = scContext.CreateType(modelType, item, false, false, null);
                }
                else if (renderingItem.RenderingItem.DataSource.HasValue())
                {
                    var item = scContext.Database.GetItem(renderingItem.RenderingItem.DataSource);
                    model = scContext.CreateType(modelType, item, false, false, null);
                }
                else if (renderingItem.Item != null)
                {
                    /**
             * Issues #82:
             * Check Item before defaulting to the current item.
             */
                    model = scContext.CreateType(modelType, renderingItem.Item, false, false, null);
                }
                else
                {
                    model = scContext.GetCurrentItem(modelType);
                }

                args.Result = model;
            }
            finally
            {
                Sitecore.Diagnostics.Log.Info("GetModelFromView {0} {1}".Formatted(watch.ElapsedMilliseconds, args.Rendering.RenderingItem.ID), this);
            }
        }