自定义内容类型中的MediaLibraryPickerField未显示

时间:2014-02-06 11:14:57

标签: c# orchardcms orchardcms-1.7

我想以编程方式创建一个内容类型,其中包括一个图像。显而易见的方法是使用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部分的字段。但是,在创建新项目时我仍然没有看到该字段。

1 个答案:

答案 0 :(得分:2)

我终于发现了什么是错的。而不是:

.WithField("Image", f => f.OfType(typeof(MediaLibraryPickerField).ToString()))

我应该这样做:

.WithField("Image", f => f.OfType("MediaLibraryPickerField"))

前者会产生Orchard.MediaLibrary.Fields.MediaLibraryPickerField类型的字段,而不仅仅是MediaLibraryPickerField,显然Orchard不知道如何处理它。