Annoyingly, the MediaData class in Episerver doesn't have any basic properties like source URL, alt text, etc. I'm trying to implement a class to inherit from MediaData and provide specific properties for a certain type of media asset (PDF in this example).
I've tried manually setting the property values and also overriding the SetDefaultValues event, to no avail. Although, I do see either a textbox or a URL picker based on the type I use for "SrcUrl", however it is blank and never populates the uploaded PDF's 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";
}
}
****Disclaimer: I'm new to the Episerver CMS and may be missing something stupidly simple (ok with being shamed if appropriate).*
答案 0 :(得分:2)
我不确定您需要完成什么,但应该注意的是,在编辑MediaData
内容时,可以通过点击发布按钮获取其网址(请注意下载此文件链接):
编辑:另一个建议是为MediaFile
UI提示创建自定义编辑器dijit(使用Dojo)。这样就可以显示URL而无需添加其他属性。
答案 1 :(得分: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;
}
}