gpt4 book ai didi

asp.net-mvc - Glass.Mapper 是否支持指向 Sitecore 7 中的 MVC 模型的链接?

转载 作者:行者123 更新时间:2023-12-01 11:44:09 25 4
gpt4 key购买 nike

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

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

Could not load type '/sitecore/layout/Models/HomeViewModel' from assembly 'Glass.Mapper.Sc, Version=3.0.2.8, Culture=neutral, PublicKeyToken=null'.

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

最佳答案

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

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

话虽这么说,但由于它是开源的,因此您自己使用它并不会太麻烦。下面是 Glass.Mapper.Sc.Pipelines.Response.GetModel 类的完整代码,我修改了它以解决我遇到的两个问题

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

请注意,我并没有修改这个类中的所有方法,只是修改了到目前为止对我来说有问题的方法。修改本身非常简单(只需让它查找链接项而不是文本字段)。我希望这有帮助。

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;
}


}

关于asp.net-mvc - Glass.Mapper 是否支持指向 Sitecore 7 中的 MVC 模型的链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16996162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com