2

令人讨厌的是,Episerver 中的 MediaData 类没有任何基本属性,如源 URL、替代文本等。我​​正在尝试实现一个类以从 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";
    }
}

查看 PDF 时,Episerver 编辑器界面中的 PDF URL 属性呈现空白

****免责声明:我是 Episerver CMS 的新手,可能会遗漏一些简单得愚蠢的东西(如果合适的话,可以感到羞耻)。*

4

2 回答 2

3

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

Episerver 发布按钮

编辑:另一个建议是为MediaFileUI 提示创建一个自定义编辑器 dijit(使用 Dojo)。这将允许您显示 URL,而无需添加其他属性。

于 2018-02-27T22:22:06.143 回答
0

在 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 的类上设置 SrcUrl 属性,该类继承自 MediaData 类。通过这种方式,所有文件类型(powerpoint、pdf 等)都可以具有此属性,因为它与所有文件类型相关。图像继承自不同的基类 (ImageData),因此我还必须创建一个名为 ImageFile 的新类,该类继承自 ImageData 并应用相同的属性。我很懒,但使用接口来标准化这两个类的实现可能是个好主意。
于 2018-03-28T15:04:47.557 回答