web-dev-qa-db-ja.com

SitecoreのGeneralLink

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");
9
Steve Ward

_linkField.Url_を使用すると、Sitecoreアイテムおよびメディアへの内部リンクが誤ってレンダリングされるため、注意が必要です。代わりにSitecore.Links.LinkManager.GetItemUrl(item)およびSitecore.Resources.Media.MediaManager.GetMediaUrl(item)を使用する必要があります。

リンクのタイプに基づいて、正しいURLを返すヘルパー(拡張)メソッドを用意することをお勧めします。これをご覧ください 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;
    }
}
_

使用法:

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

もちろん、_<sc:FieldRender>_コントロールを使用してSitecoreで処理するのが最善ですが、そのオプションがないようです。

31
jammykam

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/

14
KochFolie

Linkコントロールを使用すると簡単です。

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

これにより、コードビハインドを行う必要がなくなり、ページエディターも使用できるようになります。

5
Trayek

以下を使用できます

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

それはあなたのために働くでしょう。

2
Yogesh Sharma

アイテムのGeneralLinkフィールドに値を割り当てると、ポップアップする[内部リンク]ダイアログに「リンクの説明」というラベルの付いたフィールドがあります。その値を入力して使用します:

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

それでおしまい。すべてが自動的に魔法のように「ワイヤード」されます。

1
Josh Wheelock

アイテムのLinkfield値を取得してから、そのアイテムのLinkFieldタイプを取得する必要があります。これにより、リンクのタイプが「内部」、「外部」、「mailto」のいずれかになります。これに基づいて、@ jammykamで言及されているリンクフィールドのURLを取得できます。

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"];
}
1
HiralShah