9

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

我只是想在我的用户控件中显示链接,但我无法让它工作。这应该很简单,但我在兜圈子

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

ascx:

<asp:HyperLink runat="server" ID="lnkMain"></asp:HyperLink>

ascx.cs:

lnkMain.NavigateUrl = SiteCore.Context.Item.GetGeneralLink("Link1");
lnkMain.Text = item.GetFieldValue("Link1Text");
4

6 回答 6

31

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

根据链接的类型,最好有一个帮助器(扩展)方法为您返回正确的 url。看看这个Sitecore Links with LinkManager and 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;
    }
}

用法:

Sitecore.Data.Fields.LinkField linkField = item.Fields["Link1"];
lnkMain.NavigateUrl = linkField.LinkUrl();

当然最好使用<sc:FieldRender>控制并让 Sitecore 为您处理,但您似乎没有该选项。

于 2013-11-12T03:50:42.417 回答
16

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

Sitecore.Data.Fields.LinkField linkField = item.Fields["Link1"];
lnkMain.NavigateUrl = linkfield.GetFriendlyUrl();

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

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

于 2015-02-03T13:03:51.563 回答
5

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

<sc:Link Field="Link1" runat="server" ID="link">
    <sc:Text Field="Link1Text" runat="server" ID="linkText" />
</sc:Link>

这样,您不必执行任何代码隐藏操作,您也可以使用页面编辑器。

于 2013-11-12T09:03:15.277 回答
2

你可以在下面使用

<sc:Link ID="scLink" runat="server" Field="Your Link Field Name">
    <sc:FieldRenderer ID="frTest" runat="server" FieldName="Your Text Field Name" />
</sc:Link>

它会为你工作。

于 2014-03-31T14:45:03.657 回答
1

您需要获取项目的Linkfield值,而不是获取该LinkField项目的类型。这将为您提供“内部”、“外部”、“mailto”的链接类型,并基于此可以获取链接字段的 url,正如@jammykam 所提到的那样。

你也可以做同样的事情来检索LinkText

以供参考 :

public static string GetGeneralLinkText(LinkField link)
{
    text = "";

    if (link == null)
        return false;

    if (!string.IsNullOrEmpty(link.Text))
    {
        text = link.Text;
        return true;
    }

    switch (link.LinkType)
    {
        case "internal":
            if (link.TargetItem == null)
                return false;
            text = link["Text Field Name"];
            break;
        case "external":
        case "mailto":
        case "anchor":
        case "javascript":
            text = link.Text;
            break;
        case "media":
            if (link.TargetItem == null)
                return false;
            Sitecore.Data.Items.MediaItem media = new Sitecore.Data.Items.MediaItem(link.TargetItem);
            text = media.Name;
            break;
        case "":
            break;
        default:
            return "";
    }

    return  link["Text Field Name"];
}
于 2014-05-01T21:20:10.220 回答
1

当您将值分配给项目的 GeneralLink 字段时,会在弹出的内部链接对话框中显示一个标记为“链接描述”的字段。填写该值,然后使用:

<sc:Link runat="server" Field="{YourFieldName}" />

就是这样。一切都为您“连线”,自动神奇。

于 2014-06-23T09:07:19.080 回答