有几个类似的问题可以解决这个问题,比如这个或这个提供了一个非常老套的解决方案。那里没有一个明确的令人满意的答案,或者根本没有答案,或者一开始就问完全相同的事情。
记录
public class MyPartRecord : ContentPartRecord
{
public virtual Boolean Property1 { get; set; }
public virtual string Property2 { get; set; }
}
部分
public class MyPart : ContentPart<MyPartRecord>
{
public Boolean Property1
{
get { return Record.Property1; }
set { Record.Property1 = value; }
}
public string...
}
迁移(由 codegen 生成)
SchemaBuilder.CreateTable("MyPartRecord", table => table
.ContentPartRecord()
.Column("Property1", DbType.Boolean)
.Column("Property2", DbType.String)
);
ContentDefinitionManager.AlterPartDefinition("MyPart", part => part
.Attachable()
);
编辑器模板
@model Project.Module.Models.MyPart
<fieldset>
<legend>MyPart</legend>
<!-- Property1 -->
@Html.EditorFor(m => m.Property1)
@Html.LabelFor(m => m.Property1)
...
</fieldset>
这一切都取自关于编写内容部分的官方文档,并且工作正常。但是,我希望我的自定义部件也有一个 MediaLibraryPickerField。通过迁移添加一个很容易:
ContentDefinitionManager.AlterPartDefinition("MyPart", part => part
.WithField("Image", field => field
.OfType("MediaLibraryPickerField")
.WithDisplayName("Image")
.WithSetting("MediaLibraryFieldSettings.Required", "False")
)
);
但是我在使用这种方法时遇到了几个问题。
1)我无法在模板中呈现该字段,只能使用放置使其显示在模板其余部分上方或下方的某个位置,因此我无法将其与其所属的属性分组。
2) 由于它附加到 MyPart 而不是 MyPart 附加到的 Type 的 ContentPart,因此管理员无法通过 GUI 调整其设置,只能将其删除(这是一个错误还是尚未实现的功能?) .
3)我不确定如何在代码中访问 MediaLibraryField,因为ContentItem.MyPart
现在返回一个 MyPart 对象,所以ContentItem.MyPart.Image.FirstMediaUrl
不再有效。
我该如何解决这些问题?我在这里遗漏了一些明显的东西吗?有没有办法将 Media 作为属性添加到我的模型中,而不是使用 Field 并且仍然让 Orchard 坚持它?我真的很想避免修改我的 HTML 并将代码从官方实现复制到我的自定义视图。