【问题标题】:Get absolute Url for internal Links with Glass Mapper for Sitecore使用 Glass Mapper for Sitecore 获取内部链接的绝对 URL
【发布时间】:2014-01-19 15:08:16
【问题描述】:

我的项目模板有一个General Link 字段,并由以下类表示:

[SitecoreType]
public class MenuLink
{
    [SitecoreField(FieldName = "Link")]
    public virtual Link Link { get; set; }
}

现在我的链接字段包含外部和内部链接(指向其他项目的链接)。是否可以将 Glass Mapper 配置为 LinkUrl 属性包含绝对 URL(如 AlwaysIncludeServerUrl=true)?并且还使用了站点解析(SiteResolving=true)?

基本上我想给 Link 属性一个UrlOptions 配置。

我正在使用 Sitecore 7.1Glass.Mapper.Sc 3.1.2.18

【问题讨论】:

    标签: c# sitecore glass-mapper sitecore7.1


    【解决方案1】:

    凯文

    请下载版本 3.1.6 我已将 UrlOptions 属性添加到 SitecoreFieldAttribute 类。您应该能够像这样强制服务器路径:

    [SitecoreField(UrlOptions=SitecoreInfoUrlOptions.AlwaysIncludeServerUrl)]
    public virtual Link MyLink{get;set;}
    

    您还可以通过管道标志添加其他选项:

    [SitecoreField(UrlOptions=SitecoreInfoUrlOptions.AlwaysIncludeServerUrl|SitecoreInfoUrlOptions.LanguageEmbeddingNever)]
    public virtual Link MyLink{get;set;}
    

    【讨论】:

    • 完美,正是我需要的。非常感谢!
    • 你能用这种方法排除文件夹吗? @迈克尔爱德华兹
    • 我不确定你的意思
    【解决方案2】:

    将此扩展方法添加到您的解决方案中:

    using Sitecore;
    using Sitecore.Links;
    using Glass.Mapper.Sc.Fields;
    
    public static class LinkExtensions
    {
        public static string GetLinkUrl(this Link link, ISitecoreContext sitecoreContext = null)
        {
            if (link != null)
            {
                if (link.Type == LinkType.External || link.Type == LinkType.Media)
                {
                    return link.Url;
                }
                else if (link.Type == LinkType.Internal)
                {
                    var target = (sitecoreContext ?? new SitecoreContext()).Database.GetItem(new ID(link.TargetId));
    
                    var urlOptions = Sitecore.Links.UrlOptions.DefaultOptions;
                    urlOptions.AlwaysIncludeServerUrl = true;
                    urlOptions.SiteResolving = true;
    
                    return LinkManager.GetItemUrl(target, urlOptions);
                }
            }
    
            return string.Empty;
        }
    }
    

    那么,假设你有这个模型:

    [SitecoreType]
    public class MenuLink
    {
        [SitecoreField(FieldName = "Link")]
        public virtual Link Link { get; set; }
    }
    

    你可以这样获取网址:

    model.Link.GetLinkUrl();
    

    【讨论】:

    • 我喜欢这个想法,但我不喜欢的是对“Context.Database”的依赖,这使得代码更难测试。 Glass 使用“SitecoreContext”实例来解析上下文。您是否看到了使用与 Glass 用于映射项目相同的上下文而不是使用另一个上下文的解决方案?
    • 呵呵,我怕你会问这个;)你可以简单地将 ISitecoreContext 作为可选参数传入。在您的单元测试中,您将使用该参数,在您的常规代码中,您只需将其留空,以便它自己创建一个 SitecoreContext。您应该研究 Ahmed 给出的解决方案。这似乎是正确的做法,我不知道。
    • Jep,这将是一个简单的方法。会试试这个。感谢您的提示,但 Ahmed 的解决方案实际上并不起作用(请参阅我的评论)。所以如果这不起作用,这将是一个不错的选择:)
    【解决方案3】:

    您是否尝试将 SitecoreField 属性替换为:

    [Glass.Mapper.Sc.Configuration.Attributes.SitecoreInfo(Type=Glass.Mapper.Sc.Configuration.SitecoreInfoType.Url,UrlOptions= Glass.Mapper.Sc.Configuration.SitecoreInfoUrlOptions.AlwaysIncludeServerUrl)]
    

    我还没有尝试过,但值得一试。

    更新:此方法无法正常工作,请参考 Michael solution

    【讨论】:

    • 这对我不起作用。如果我将属性添加到我的“链接”属性,我会收到异常“无法在 DomainModel.MenuLink 上映射属性链接”->“无法将类型为“System.String”的对象转换为类型“Glass.Mapper.Sc”。字段.链接'。”。那么这个属性只返回 Url 而不是完整的 Link 属性,其中 Url 作为绝对链接?当我添加一个新的字符串属性并添加属性时,我得到了链接字段的原始值,而不是所需的 url。并且此属性是否仅适用于 1 UrlOptions 参数?如果我还想添加“SiteResolving”,如何实现?
    • 不错,我不知道这个。
    • 抱歉 kevin 我以为 Amhed 使用了 Field 处理程序,但我现在意识到 SitecoreField 属性没有 UrlOptions 属性。我会添加这个并尽快发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多