我想以编程方式创建一个内容类型,其中包括一个图像。显而易见的方法是使用MediaLibraryPickerField
。
我的问题与this one非常相似,但遗憾的是它没有给出答案
我的问题是我无法让这个领域出现。我一直在挖掘文档和其他在线资源,但到目前为止还没有运气。我将在这里发布我的所有代码,希望有人能看到我所缺少的东西。我正在学习,所以如果我做任何奇怪的事情,请不要犹豫,指出来。
我的内容类型应包含:
Migration.cs:
SchemaBuilder.CreateTable("MyTypePartRecord",
table => table
.ContentPartRecord()
.Column<string>("Description", c => c.Unlimited())
);
ContentDefinitionManager.AlterPartDefinition(
"MyTypePart", builder => builder
.WithDescription("Turns content types into a MyType.")
.WithField("Image", f => f.OfType(typeof(MediaLibraryPickerField).ToString()))
.Attachable()
);
ContentDefinitionManager.AlterTypeDefinition(
"MyType",cfg => cfg
.WithPart("CommonPart")
.WithPart("MyTypePart")
.WithPart("TitlePart")
.WithPart("BodyPart")
.Creatable()
);
型号/ MyTypePart.cs:
public class MyTypePart : ContentPart<MyTypePartRecord>
{
public string Description
{
get { return Record.Description; }
set { Record.Description = value; }
}
}
型号/ MyTypePartRecord.cs:
public class MyTypePartRecord : ContentPartRecord
{
[StringLengthMax]
public virtual string Description { get; set; }
}
型号/ MyTypePartRecordHandler.cs:
public class MyTypePartRecordHandler : ContentHandler
{
public MyTypePartRecordHandler(IRepository<MyTypePartRecord> repository) {
Filters.Add(StorageFilter.For(repository));
}
}
驱动器/ MyTypeDriver.cs
public class MyTypeDriver : ContentPartDriver<MyTypePart> {
public MyTypeDriver() {
}
// GET
protected override DriverResult Display(MyTypePart part, string displayType, dynamic shapeHelper) {
return ContentShape("Parts_MyType",
()=> shapeHelper.Parts_MyType(
Description: part.Description
));
}
// GET
protected override DriverResult Editor(MyTypePart part, dynamic shapeHelper)
{
return ContentShape("Parts_MyType_Edit",
() => shapeHelper.EditorTemplate(
TemplateName: "Parts/MyType",
Model: part,
Prefix: Prefix));
}
// POST
protected override DriverResult Editor(MyTypePart part, IUpdateModel updater, dynamic shapeHelper)
{
updater.TryUpdateModel(part, Prefix, null, null);
return Editor(part, shapeHelper);
}
}
查看/ EditorTemplates /零件/ MyType.cshtml:
@model MySolution.Models.MyType
<fieldset>
<div class="editor-label">@T("Description"):</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.Description)
@Html.ValidationMessageFor(m => m.Description)
</div>
</fieldset>
查看/零件/ MyType.cshtml:
@using MySolution.Models
<div>Description: @Model.Description</div>
placement.info:
<Placement>
<Place Parts_MyType="Content:1"/>
<Place Parts_MyType_Edit="Content:7.5"/>
</Placement>
更新
根据建议,我在整个模块中将MyTypePart
更改为MyType
。现在,在内容定义中,我直接在我的内容类型中看到Image
字段,而不是内容类型的MyTypePart部分的字段。但是,在创建新项目时我仍然没有看到该字段。
答案 0 :(得分:2)
我终于发现了什么是错的。而不是:
.WithField("Image", f => f.OfType(typeof(MediaLibraryPickerField).ToString()))
我应该这样做:
.WithField("Image", f => f.OfType("MediaLibraryPickerField"))
前者会产生Orchard.MediaLibrary.Fields.MediaLibraryPickerField
类型的字段,而不仅仅是MediaLibraryPickerField
,显然Orchard不知道如何处理它。