Der*_*ker 3 asp.net-mvc sitecore sitecore7 glass-mapper
在Sitecore的7,现在可以创建在模型定义的项目/sitecore/layout/Models
,并将其链接到我的Layouts
和Renderings
(而不是硬编码型+组件上各一个).这使得管理变得更加容易,特别是如果我需要更新我的命名空间或查看哪些布局使用特定模型.
也就是说,我遇到了一个问题,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中的模型,或者我是否正确假设它只是没有解析模型的内部链接字段?
更新:现在在最新版本中正常工作,以下我所说的都不再需要了,为了后人的缘故.
我自己遇到了这个问题,不幸的是,这似乎并不支持.我查看了Trello for Glass,看起来Sitecore 7的测试/支持是即将到来的任务,尽管除了一两个问题外,它主要以当前形式运行.
这就是说,因为它是开源的,所以让它自己工作并不是太麻烦.下面是Glass.Mapper.Sc.Pipelines.Response.GetModel类的完整代码,我已修改该类以解决我遇到的两个问题
请注意,我没有修改这个类中的所有方法,只是那些迄今为止已经破坏的方法.修改本身非常简单(只需要查找链接项而不是文本字段).我希望这有帮助.
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)
归档时间: |
|
查看次数: |
858 次 |
最近记录: |