Sitecore中的GeneralLink

Ste*_*ard 9 c# asp.net sitecore

我是Sitecore的新手.我创建了一个页面模板,并为General Link类型的URL添加了一个字段.我为链接的文本创建了另一个字段(这是此项目中的标准做法).

我只是想在我的用户控件中显示链接,但我不能让它工作.这应该很简单,但我会围成一圈

这是我试过的代码示例..

ascx:

<asp:HyperLink runat="server" ID="lnkMain"></asp:HyperLink>
Run Code Online (Sandbox Code Playgroud)

ascx.cs:

lnkMain.NavigateUrl = SiteCore.Context.Item.GetGeneralLink("Link1");
lnkMain.Text = item.GetFieldValue("Link1Text");
Run Code Online (Sandbox Code Playgroud)

jam*_*kam 31

您应该小心使用,linkField.Url因为它会错误地呈现Sitecore项目和媒体的内部链接.你应该使用Sitecore.Links.LinkManager.GetItemUrl(item)Sitecore.Resources.Media.MediaManager.GetMediaUrl(item)那些.

根据链接类型,最好有一个帮助(扩展)方法为您返回正确的URL.看看这个Sitecore链接与LinkManager和MediaManager博客文章,其中包含您需要的正确代码.

以供参考:

public static String LinkUrl(this Sitecore.Data.Fields.LinkField lf)
{
    switch (lf.LinkType.ToLower())
    {
      case "internal":
        // Use LinkMananger for internal links, if link is not empty
        return lf.TargetItem != null ? Sitecore.Links.LinkManager.GetItemUrl(lf.TargetItem) : string.Empty;
      case "media":
        // Use MediaManager for media links, if link is not empty
        return lf.TargetItem != null ? Sitecore.Resources.Media.MediaManager.GetMediaUrl(lf.TargetItem) : string.Empty;
      case "external":
        // Just return external links
        return lf.Url;
      case "anchor":
        // Prefix anchor link with # if link if not empty
        return !string.IsNullOrEmpty(lf.Anchor) ? "#" + lf.Anchor : string.Empty;
      case "mailto":
        // Just return mailto link
        return lf.Url;
      case "javascript":
        // Just return javascript
        return lf.Url;
      default:
        // Just please the compiler, this
        // condition will never be met
        return lf.Url;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

Sitecore.Data.Fields.LinkField linkField = item.Fields["Link1"];
lnkMain.NavigateUrl = linkField.LinkUrl();
Run Code Online (Sandbox Code Playgroud)

当然最好使用<sc:FieldRender>控件,让Sitecore为你处理它,但看起来你没有那个选项.

  • 为什么sitecore没有将它构建到他们的应用程序中,这看起来像是从我的角度来看.这不应该是开发人员应该处理的东西. (5认同)

小智 14

从Sitecore 7.2开始,有一个替代linkField.Url:

Sitecore.Data.Fields.LinkField linkField = item.Fields["Link1"];
lnkMain.NavigateUrl = linkfield.GetFriendlyUrl();
Run Code Online (Sandbox Code Playgroud)

引入了一个新的LinkField.GetFriendlyUrl()方法.无论字段包含哪种类型的链接,该方法都可以轻松输出有效的URL.对于内部链接,该方法从LinkManager.GetItemUrl()返回一个URL.对于媒体链接,该方法从MediaManager.GetMediaUrl()返回一个URL.对于外部链接,锚链接,电子邮件链接和JavaScript链接,该方法返回LinkField.Url属性的值.(400051)

http://techitpro.com/uncategorized/sitecore-7-2-changes/

  • 开发人员为什么在刚开始使用不同的链接类型时没有介绍它,这似乎并没有为他们带来很多预见。 (2认同)

Tra*_*yek 5

如果使用Link控件会更容易:

<sc:Link Field="Link1" runat="server" ID="link">
    <sc:Text Field="Link1Text" runat="server" ID="linkText" />
</sc:Link>
Run Code Online (Sandbox Code Playgroud)

这样,您不必执行任何代码隐藏的东西,您也可以使用页面编辑器.