2

有几个类似的问题可以解决这个问题,比如这个这个提供了一个非常老套的解决方案。那里没有一个明确的令人满意的答案,或者根本没有答案,或者一开始就问完全相同的事情。

记录

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 并将代码从官方实现复制到我的自定义视图。

4

1 回答 1

4

1) 使用placement.info 和alternatives 来自定义你想在哪里呈现字段

2)您应该能够调整仪表板中的设置 -> 内容定义 -> YourContentType -> 部件 -> 在 MyPart 设置下。

您也可以将字段附加到类型(注意:它并不是真正附加到类型,而是附加到与类型同名的部分):

迁移.cs:

ContentDefinitionManager.AlterPartDefinition("MyType", part => part
    .WithField("Image", field => field
        .OfType("MediaLibraryPickerField")
        .WithDisplayName("Image")
        .WithSetting("MediaLibraryFieldSettings.Required", "False")
    )
);

ContentDefinitionManager.AlterTypeDefinition("MyType", type => type
    .WithPart("MyType");

3)您可以使用动态符号,也可以搜索该字段:

// cast to dynamic
var url = ((dynamic)ContentItem).MyPart.Image.FirstMediaUrl

// or search for the field
var field = ContentItem.MyPart.Fields.OfType<MediaLibraryPickerField>().Single(f => f.Name == "Image");
// or ContentItem.MyPart.Fields.Single(f => f.Name == "Image") as MediaLibraryPickerField;
var url = field.FirstMediaUrl;
于 2016-04-21T10:57:27.437 回答