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");
_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で処理するのが最善ですが、そのオプションがないようです。
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)
Linkコントロールを使用すると簡単です。
<sc:Link Field="Link1" runat="server" ID="link">
<sc:Text Field="Link1Text" runat="server" ID="linkText" />
</sc:Link>
これにより、コードビハインドを行う必要がなくなり、ページエディターも使用できるようになります。
以下を使用できます
<sc:Link ID="scLink" runat="server" Field="Your Link Field Name">
<sc:FieldRenderer ID="frTest" runat="server" FieldName="Your Text Field Name" />
</sc:Link>
それはあなたのために働くでしょう。
アイテムのGeneralLinkフィールドに値を割り当てると、ポップアップする[内部リンク]ダイアログに「リンクの説明」というラベルの付いたフィールドがあります。その値を入力して使用します:
<sc:Link runat="server" Field="{YourFieldName}" />
それでおしまい。すべてが自動的に魔法のように「ワイヤード」されます。
アイテムの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"];
}