Episerver CMS:创建显示上传媒体资产源URL的属性方法求助
解决Episerver中媒体资产URL显示及自定义MediaData属性填充问题
我之前做Episerver项目时也踩过类似的坑,尤其是自定义媒体类时属性不自动填充的问题,给你一步步拆解解决:
一、在编辑器界面显示上传资产的源URL
Episerver的MediaData基类其实自带了Url属性,但默认不会在编辑器界面展示。你有两种简单方式让它可见:
1. 直接暴露默认的Url属性
不管是系统自带的ImageData还是你自定义的媒体类,只需要给Url属性添加Display特性,就能让它在编辑器里显示:
[ContentType(DisplayName = "自定义PDF资产", GUID = "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")] public class PdfMedia : MediaData { // 把默认Url属性显示到编辑器的内容标签页 [Display( Name = "源URL", Order = 10, GroupName = SystemTabNames.Content)] public override string Url { get; set; } // 添加自定义替代文本属性 [Display( Name = "替代文本", Order = 20, GroupName = SystemTabNames.Content)] public virtual string AlternativeText { get; set; } }
这样编辑器就能看到自动生成的源URL,完全不用手动维护。
2. 自定义绝对URL属性(如果需要)
要是你需要带域名的绝对URL,可以加一个计算属性(不用存到数据库):
[Display( Name = "绝对源URL", Order = 15, GroupName = SystemTabNames.Content)] public virtual string AbsoluteSrcUrl { get { if (ContentLink != null) { return UrlResolver.Current.GetUrl(ContentLink, null, new VirtualPathArguments { ContextMode = ContextMode.Default }); } return string.Empty; } }
这个属性会自动计算媒体的绝对URL,编辑器里能看但不能编辑。
二、修复自定义MediaData类的属性自动填充问题
你说SetDefaultValues无效,核心原因是:上传媒体时,Episerver先调用SetDefaultValues创建内容模板,之后才会处理文件上传并生成Url等属性——所以在SetDefaultValues里根本拿不到已经生成的URL。
正确的做法是用Episerver的内容生命周期事件处理,比如ContentEvents.Created:
1. 注册内容创建事件
在项目的初始化模块里注册事件(比如创建一个MediaInitialization类):
[InitializableModule] [ModuleDependency(typeof(EPiServer.Web.InitializationModule))] public class MediaInitialization : IInitializableModule { public void Initialize(InitializationEngine context) { var contentEvents = context.Locate.Advanced.GetInstance<IContentEvents>(); contentEvents.Created += OnMediaCreated; } private void OnMediaCreated(object sender, ContentEventArgs e) { // 只处理我们自定义的PDF媒体类 var pdfMedia = e.Content as PdfMedia; if (pdfMedia == null) return; // 填充自定义SrcUrl属性(其实用默认Url属性更推荐,这里仅作示例) if (string.IsNullOrEmpty(pdfMedia.SrcUrl)) { pdfMedia.SrcUrl = pdfMedia.Url; } // 自动填充替代文本(比如从文件名提取) if (string.IsNullOrEmpty(pdfMedia.AlternativeText) && !string.IsNullOrEmpty(pdfMedia.Name)) { pdfMedia.AlternativeText = Path.GetFileNameWithoutExtension(pdfMedia.Name); } // 保存修改 var contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>(); contentRepository.Save(pdfMedia, SaveAction.Publish, AccessLevel.NoAccess); } public void Uninitialize(InitializationEngine context) { var contentEvents = context.Locate.Advanced.GetInstance<IContentEvents>(); contentEvents.Created -= OnMediaCreated; } }
2. 关键注意事项
- 别在
SetDefaultValues里处理依赖文件上传的属性,那时候文件还没处理,Url等属性都是空的。 - 如果自定义
SrcUrl只是为了显示,完全没必要自己存,直接用MediaData自带的Url属性就行(参考第一部分的方法)。 - 确保自定义媒体类的
ContentType特性GUID唯一,项目编译后Episerver能识别到。 - 测试前清空Episerver缓存,有时候缓存会导致新属性或事件不生效。
内容的提问来源于stack exchange,提问作者webDevAndEverythingElse
相关产品推荐
相关产品推荐

