如何在Sitecore中生成id为而不是路径的媒体项链接

如何在Sitecore中生成id为而不是路径的媒体项链接,sitecore,sitecore6,sitecore-media-library,Sitecore,Sitecore6,Sitecore Media Library,有人知道如何在sitecore中使用ID而不是项目路径生成链接吗 如果使用API中的GetMediaUrl方法,我可以获得以下URL: /~/media/Images/Archive/content/News and Events/News_and_Events_Level2/20070419162739/iwhiz3.jpg 这种方法的问题是,如果有人更改媒体项名称、将其移到某处或将其删除,上述链接将中断 我注意到,如果我从富格文本编辑器插入媒体链接,我会得到如下链接: /~/media/14

有人知道如何在sitecore中使用ID而不是项目路径生成链接吗

如果使用API中的GetMediaUrl方法,我可以获得以下URL:

/~/media/Images/Archive/content/News and Events/News_and_Events_Level2/20070419162739/iwhiz3.jpg

这种方法的问题是,如果有人更改媒体项名称、将其移到某处或将其删除,上述链接将中断

我注意到,如果我从富格文本编辑器插入媒体链接,我会得到如下链接:

/~/media/14bded00e4dd64dfd8f74019aed4d74eb.ashx

第二个链接更好,因为它使用的是项目id,因此如果实际的媒体项目被重命名、删除或删除,所有相关链接也将更新。最重要的是,当Sitecore呈现页面时,它实际上会转换上面的链接并显示项目路径,以便可读

我正在使用Sitecore 6.5,目前正在进行内容迁移,因此我需要确保所有内部链接都已正确更新

我可以知道是否有一种方法可以使用sitecore API生成第二个链接吗


谢谢

这些被称为
动态链接
,您通常可以使用
链接管理器
生成它们,例如:

Sitecore.Links.LinkManager.getdynamiccurl(项目)

。。但我不确定使用媒体链接的方法(可能有一个,但我似乎找不到,而且它不在
MediaManager
上),但基本语法是:


“/~/media/”+item.ID.tosortid()+“.ashx”

扩展方法似乎可以满足您的需要

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"));
    }
}

如果您始终希望使用ID而不是路径,则可以在webconfig中将此设置更改为false(如下所示):

然后,您可以使用默认实现(无其他参数):

这就是我使用的:

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);

这是可行的,但我必须将absolutepath设置为false,否则链接将显示为and Events/News_and_Events_Level2/20070419162739/iwhiz3.jpg以下是我的url选项:var urlpoptions=new MediaUrlOptions{absolutepath=false,UseItemPath=false,AlwaysIncludeExtension=true};
 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);
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);