【问题标题】:Does Glass.Mapper support links to MVC Models in Sitecore 7?Glass.Mapper 是否支持 Sitecore 7 中的 MVC 模型链接?
【发布时间】:2013-06-08 04:47:41
【问题描述】:

在 Sitecore 7 中,现在可以在 /sitecore/layout/Models 下创建模型定义项并将它们链接到我的 LayoutsRenderings(而不是在每个项上硬编码类型 + 程序集)。这使得管理变得更加容易,尤其是当我需要更新我的命名空间或查看哪些布局正在使用特定模型时。

也就是说,我遇到了一个问题,Glass.Mapper 似乎解析“模型”字段,就好像它是一个 text 字段,而实际上它是一个 Internal Link 字段。这是我得到的错误:

无法从 程序集'Glass.Mapper.Sc,版本=3.0.2.8,文化=中性, PublicKeyToken=null'。

如果 Glass 支持链接到 Sitecore 7 中的模型,现在有人吗,或者我是否正确地假设它只是没有将内部链接字段解析到模型?

【问题讨论】:

    标签: asp.net-mvc sitecore sitecore7 glass-mapper


    【解决方案1】:

    更新:这在最新版本中现在可以正常工作,不再需要我在下面所说的内容,为后代保留。

    我自己遇到了这个问题,不幸的是,它似乎不受支持。我查看了 Trello for Glass,看起来 Sitecore 7 测试/支持是一项即将完成的任务,尽管除了一两个问题之外,它主要以当前形式运行。

    话虽如此,因为它是开源的,让它自己工作并不是一件麻烦事。下面是 Glass.Mapper.Sc.Pipelines.Response.GetModel 类的完整代码,我对其进行了修改以解决我遇到的两个问题

    1. 你提到的问题
    2. 扩展类以允许自动使用 DataSource 而不是上下文项来生成模型。我在代码中添加了一条注释,让您知道如何禁用这部分文件,因为它依赖于库中其他地方的另一个更改(但如果您愿意,我也可以提供)。

    请注意,我并没有修改这个类中的所有方法,只是到目前为止对我来说已经坏掉的那些方法。修改本身相当简单(只需让它寻找链接的项目而不是文本字段)。我希望这有帮助。

    public class GetModel : GetModelProcessor
    {
        public GetModel()
        {
            ContextName = "Default";
    
        }
        public string ContextName { get; set; }
    
        public override void Process(GetModelArgs args)
        {
            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);
                }
            }
        }
        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;
    
            Item model = MvcSettings.GetRegisteredObject<ItemLocator>().GetItem(obj["Model"]);
    
            if (model == null)
                return (object)null;
            else
                return GetObject(model["Model Type"], rendering);
        }
        protected virtual object GetFromPropertyValue(Rendering rendering, GetModelArgs args)
        {
            string model = rendering.Properties["Model"];
            if (StringExtensions.IsWhiteSpaceOrNull(model))
                return (object)null;
            else
                return GetObject(model, rendering);
        }
    
        protected virtual object GetFromLayout(Rendering rendering, GetModelArgs args)
        {
            string pathOrId = rendering.Properties["LayoutId"];
            if (StringExtensions.IsWhiteSpaceOrNull(pathOrId))
                return (object)null;
            string modelItemPath = ObjectExtensions.ValueOrDefault<Item, string>(MvcSettings.GetRegisteredObject<ItemLocator>().GetItem(pathOrId), (Func<Item, string>)(i => i["Model"]));
            string model = ObjectExtensions.ValueOrDefault<Item, string>(MvcSettings.GetRegisteredObject<ItemLocator>().GetItem(modelItemPath), (Func<Item, string>)(i => i["Model Type"]));
            if (StringExtensions.IsWhiteSpaceOrNull(model))
                return (object)null;
            else
                return GetObject(model, rendering);
        }
    
        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, rendering);
        }
    
    
        public object GetObject(string model, Rendering rendering)
        {
    
            if (model.IsNullOrEmpty())
                return null;
    
            var type = Type.GetType(model, true);
    
            if (type == null)
                return null;
    
            var context = Context.Contexts[ContextName];
            if (context == null) throw new MapperException("Failed to find context {0}".Formatted(ContextName));
    
            if (context.TypeConfigurations.ContainsKey(type))
            {
                ISitecoreContext scContext = new SitecoreContext(context);
    
                //comment this if block out if you just need to solve the model link problem
                if (rendering != null)
                {
                    if (rendering.Item != null)
                    {                        
                        var dataSourceResult = scContext.GetCurrentItem(type, itemOverride: rendering.Item);
                        return dataSourceResult;
                    }
                }
    
                var result = scContext.GetCurrentItem(type);
                return result;
            }
            return null;
        }
    
    
    }
    

    【讨论】:

    • 请注意。这似乎在 3.03.11 版本中得到解决(我在遇到同样问题后刚刚升级到该版本)。
    • 链接项目问题已解决。如果您想在项目上使用数据源并且不想使用 GetCurrentItem 的重载来修改 ISitecoreContent 和 SitecoreContext,您可以从 GetModel.GetObject 调用以下命令 - var dataSourceResult = scContext.CreateType(type, rendering.Item,假,假,空);
    • 非常感谢,对 Glass 来说还是新手(太棒了),但我认为最新版本实际上正在按照我们想要的方式运行(仍然需要进行更多测试)。感谢您的跟进。
    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2013-04-10
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多