任何人都知道如何使用ID而不是项目路径在sitecore中生成链接?
如果您使用API中的GetMediaUrl方法,我可以获取此URL:
/〜/ media / Images / Archive / content / News and Events / News_and_Events_Level2 / 20070419162739 / iwhiz3.jpg
这种方法的问题在于,如果某人更改了媒体项目名称,将其删除或删除它,上述链接就会中断。
我注意到如果我从富文本编辑器插入媒体链接,我会得到如下链接:
/~/media/14BDED00E4D64DFD8F74019AED4D74EB.ashx
第二个链接更好,因为它使用了项目ID,因此如果重命名,删除或删除实际媒体项目,所有相关链接也将更新。最重要的是,当Sitecore呈现页面时,它实际上将转换上面的链接并显示项目路径,以便它可读。
我正在使用Sitecore 6.5并且正在进行内容迁移,因此我需要确保所有内部链接都已正确更新。
我是否知道是否有使用sitecore API生成第二个链接的方法?
谢谢!
答案 0 :(得分:12)
GetMediaItemUrl
扩展方法似乎可以为您提供所需的内容。
public static class ItemExtensions
{
public static string GetMediaItemUrl(this Item item)
{
var mediaUrlOptions = new MediaUrlOptions() { UseItemPath = false, AbsolutePath = true };
return Sitecore.Resources.Media.MediaManager.GetMediaUrl(item, mediaUrlOptions);
}
}
[TestFixture]
public class when_using_items_extensions
{
[Test]
public void a_url_based_on_media_item_id_can_be_generated()
{
// Arrange
Database db = global::Sitecore.Configuration.Factory.GetDatabase("master");
Item item = db.GetItem("/sitecore/media library/Images/MyImage");
// Act
var mediaUrl = item.GetMediaItemUrl();
// Assert
Assert.That(mediaUrl, Is.EqualTo("/~/media/17A1341ABEEC46788F2159843DCEAB03.ashx"));
}
}
答案 1 :(得分:2)
这些被称为dynamic links
,您通常可以使用LinkManager
生成它们,例如:
Sitecore.Links.LinkManager.GetDynamicUrl(item)
..但我不确定使用媒体链接执行此操作的方法(可能有一个但我似乎无法找到它并且它不在MediaManager
上),但基本语法是:
"/~/media/" + item.ID.ToShortID() + ".ashx"
答案 2 :(得分:1)
如果您总是想使用ID而不是路径,可以将webconfig中的此设置更改为false(如下所示):
<setting name="Media.UseItemPaths" value="false"/>`
以下是webconfig描述的内容:
MEDIA - USE ITEM PATHS FOR URLS
This setting controls if item paths are used for constructing media URLs.
If false, short ids will be used.
Default value: true
然后您可以使用默认实现(无需其他参数):
Sitecore.Resources.Media.MediaManager.GetMediaUrl(item);
答案 3 :(得分:0)
这就是我使用的:
var imgField = ((Sitecore.Data.Fields.ImageField)currentItem.Fields["Icon"]);
MediaUrlOptions opt = new MediaUrlOptions();
opt.AlwaysIncludeServerUrl = true;
// Absolute Path works as well. So either use AbsolutePath or AlwaysIncludeServerUrl
opt.AbsolutePath = true;
string mediaUrl = MediaManager.GetMediaUrl(imgField.MediaItem, opt);