Glass.Mapper是否支持Sitecore 7中MVC模型的链接?

Der*_*ker 3 asp.net-mvc sitecore sitecore7 glass-mapper

在Sitecore的7,现在可以创建在模型定义的项目/sitecore/layout/Models,并将其链接到我的LayoutsRenderings(而不是硬编码型+组件上各一个).这使得管理变得更加容易,特别是如果我需要更新我的命名空间或查看哪些布局使用特定模型.

也就是说,我遇到了一个问题,Glass.Mapper似乎解析了'Model'字段,好像它是一个text字段,当它实际上是一个Internal Link字段时.这是我得到的错误:

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

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

Bla*_*ott 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;
    }


}
Run Code Online (Sandbox Code Playgroud)

  • 只是一个抬头.这似乎在版本3.03.11中解决(我刚刚在遇到相同问题后升级到). (2认同)