5

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

如果你使用 API 中的 GetMediaUrl 方法,我可以得到这个 URL:

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

这种方法的问题在于,如果有人更改媒体项目名称、将其删除或删除,上述链接将中断。

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

///媒体/14BDED00E4D64DFD8F74019AED4D74EB.ashx

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

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

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

谢谢!

4

4 回答 4

14

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"));
    }
}
于 2012-10-11T17:15:12.890 回答
3

这些被调用dynamic links,您通常可以使用LinkManager例如生成它们:

Sitecore.Links.LinkManager.GetDynamicUrl(item)

..但我不确定使用媒体链接执行此操作的方法(可能有一个,但我似乎找不到它并且它不在MediaManager),但基本语法是:

"/~/media/" + item.ID.ToShortID() + ".ashx"

于 2012-10-11T11:38:04.913 回答
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);
于 2012-10-12T19:23:59.877 回答
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);
于 2015-05-04T16:53:12.020 回答