在 Episerver CMS 中,如何创建 属性 来显示上传图片或 PDF 资源的来源 URL(在 Episerver 编辑器界面中)?

In Episerver CMS, how to create a property to display the source URL of an uploaded image or PDF asset (in the Episerver editor interface)?

令人讨厌的是,Episerver 中的 MediaData class 没有任何基本属性,如源 URL、替代文本等。我​​正在尝试实现一个 class 来继承来自 MediaData 并为特定类型的媒体资产(本例中为 PDF)提供特定属性。

我已经尝试手动设置 属性 值并覆盖 SetDefaultValues 事件,但无济于事。虽然,根据我用于 "SrcUrl" 的类型,我确实看到了一个文本框或一个 URL 选择器,但是它是空白的并且从不填充上传的 PDF 的 URL.

[ContentType(
    DisplayName = "PDF File",
    GUID = "xxxxxxx-xxxx-xxxxxx-xxxx-xxxxxxxxxxx")]
[MediaDescriptor(ExtensionString = "pdf")]
public class PdfFile : MediaData
{
    [UIHint(UIHint.MediaFile)]
    [Display(Name = "PDF URL",
        Description = "Link to view or reference PDF",
        GroupName = SystemTabNames.Content,
        Order = 10)]
    public virtual string SrcUrl
    {
        get { return UrlResolver.Current.GetUrl(this.ContentLink); }
        set { value = UrlResolver.Current.GetUrl(this.ContentLink); }
    }

    // Sets the default property values
    public override void SetDefaultValues(ContentType contentType)
    {
        base.SetDefaultValues(contentType); 

        this.SrcUrl = UrlResolver.Current.GetUrl(this.ContentLink) ?? "Default";
    }
}

****免责声明:我是 Episerver CMS 的新手,可能遗漏了一些非常简单的东西(如果合适的话,可以被羞辱)。*

我不确定您需要完成什么,但可能应该注意,在编辑 MediaData 内容时,其 URL 可通过单击 发布 按钮(注意 下载此文件 link):

编辑: 另一个建议是为 MediaFile UI 提示创建自定义编辑器 dijit(使用 Dojo)。这将允许您显示 URL 而无需添加额外的 属性.

我能够在 Epi 支持的帮助下解决这个问题,本质上 我需要创建一个可初始化模块 - 这样我就可以挂钩所需的生命周期事件内容创作。

[InitializableModule]
[ModuleDependency(typeof(InitializationModule))]
public class ModelDefaultValuesInitialization : IInitializableModule
{
    public void Initialize(InitializationEngine context)
    {
        var contentEvents = ServiceLocator.Current.GetInstance<IContentEvents>();
        contentEvents.CreatedContent += MediaBlocksDefaultValues;
    }

    private void MediaBlocksDefaultValues(object sender, ContentEventArgs e)
    {
        PopulateAssetURL(e);
    }

    /// <summary>
    /// Get the URL path of the uploaded asset and set it to the SrcUrl field which is easily visible to editors
    /// </summary>
    /// <param name="e"></param>
    private void PopulateAssetURL(ContentEventArgs e)
    {
        var mediaTypeBlock = e.Content as PdfFile;
        if (mediaTypeBlock != null)
        {
            string result = ServiceLocator.Current.GetInstance<UrlResolver>().GetUrl(mediaTypeBlock.ContentLink);
            if (!string.IsNullOrEmpty(result))
            {
                var srvcLoc = ServiceLocator.Current.GetInstance<IContentRepository>();
                var contentClone = mediaTypeBlock.CreateWritableClone() as PdfFile;
                contentClone.SrcUrl = result;
                srvcLoc.Save(contentClone, SaveAction.Publish, EPiServer.Security.AccessLevel.Administer);
            }
        }            
    }

    public void Uninitialize(InitializationEngine context)
    {
        var contentEvents = ServiceLocator.Current.GetInstance<IContentEvents>();
        contentEvents.CreatedContent -= MediaBlocksDefaultValues;
    }
}
  • 注意:我发布上面的内容是为了保持一致,但实际上我重构了代码以在名为 BaseMediaData 的 class 上设置 SrcUrl 属性,它继承自 MediaData class.这样,所有文件类型(powerpoints、pdf 等)都可以有这个 属性,因为它与所有文件都相关。图像继承自不同的基 class (ImageData),因此我还必须创建一个名为 ImageFile 的新 class,它继承自 ImageData 并应用相同的 属性。我很懒惰,但使用一个接口来标准化两个 classes 中的此实现可能是个好主意。