3

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

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

无法从程序集“Glass.Mapper.Sc,Version=3.0.2.8,Culture=neutral,PublicKeyToken=null”加载类型“/sitecore/layout/Models/HomeViewModel”。

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

4

1 回答 1

5

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

我自己遇到了这个问题,不幸的是,它似乎不受支持。我查看了 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;
    }


}
于 2013-06-09T22:30:36.780 回答