【问题标题】:Orchard CMS 1.4.2 - Edit view for my custom content type doesn't show content part dataOrchard CMS 1.4.2 - 我的自定义内容类型的编辑视图不显示内容部分数据
【发布时间】:2012-07-10 15:58:58
【问题描述】:

设置:

我正在创建一个模块,以便我的客户可以将他们自己的公司电子邮件作为内容进行管理。

这个想法是避免将人们的真实电子邮件地址放在公共网站上,因此对于网站用户发送电子邮件,我让 Orchard 显示一个表单。没问题。我的问题(见下文)与 Orchard 如何在 仪表板 中显示内容项有关,而不是网站面向公众的部分。

继续:

我创建了(参见下面的 migration.cs)一个名为 EmailAddress 的内容类型。它基本上只是一个名为 CorporateEmailPart 的内容部分的内容类型包装器。

我设置的另一个相关部分是驱动程序(请参阅下面的 CorporateEmailPartDriver.cs)。我在 PluralSight.com 上关注 Kevin Kuebler 的视频来编写驱动程序。调试显示它工作正常。

使用我模块中的 Placement.info 文件放置形状。

所以,如果不是因为……一切都会正常工作的……

问题:

驱动程序正确地允许我为我的内容类型的编辑器创建形状,显示效果很好。

或者更确切地说,显示良好,允许我创建一个新的电子邮件地址。我可以很好地将 CorporateEmailPart 保存到数据库中。

但是,当我保存新的 EmailAddress 内容类型或尝试编辑现有内容类型时,CorporateEmailPart 的字段根本不会显示在我的 EmailAddress 编辑器上。

即,当我在我的 POST DriverResult Editor 方法中返回 GET Editor ContentShape 时,仅显示我的 Content Type 的 CommonPart(即 ContentItem 的所有者字段)。不显示 CorporateEmailPart 数据。甚至没有空文本框。

我一定遗漏了一些简单的东西,因为其他一切正常。

但我就是看不到……!

代码:

Migrations.cs:

using Orchard.ContentManagement.MetaData;
using Orchard.Core.Contents.Extensions;
using Orchard.Data;
using Orchard.Data.Migration;
using Wingspan.CorporateEmails.Models;

namespace Wingspan.CorporateEmails {
    public class Migrations : DataMigrationImpl {

        public int Create() {
            ContentDefinitionManager.AlterTypeDefinition("EmailAddress", builder =>
                builder
                .WithPart("CommonPart")
                .Creatable());

            SchemaBuilder.CreateTable("CorporateEmailPartRecord", table =>
                table.ContentPartRecord()
                .Column<string>("Alias")
                .Column<string>("EmailAddress")
                .Column<int>("DisplayOrder")
                .Column<string>("DisplayTitle")
                .Column<bool>("IsDefault"));

            ContentDefinitionManager.AlterPartDefinition(typeof(CorporateEmailPart).Name, p => p.Attachable());

            ContentDefinitionManager.AlterTypeDefinition("EmailAddress", builder =>
                builder
                .WithPart(typeof(CorporateEmailPart).Name));

            SchemaBuilder.CreateTable("EmailMessageRecord", table =>
                table
                .Column<int>("Id", col => col.PrimaryKey().Identity())
                .Column<int>("CorporateEmailPartRecord_Id")
                .Column<string>("Sender")
                .Column<string>("Recipient")
                .Column<string>("Subject")
                .Column<string>("Body")
                .Column<string>("TitleAndName")
                .Column<string>("Address")
                .Column<string>("Telephones"));

            return 1;
        }
    }
}

CorporateEmailDriver.cs

using System.Collections.Generic;
using System.Web.Routing;
using Orchard;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.Data;
using Orchard.Services;
using Wingspan.CorporateEmails.Models;
using Wingspan.CorporateEmails.ViewModels;
using System.Linq;


namespace Wingspan.CorporateEmails.Drivers {
    public class CorporateEmailPartDriver : ContentPartDriver<CorporateEmailPart>{
        private readonly IRepository<EmailMessageRecord> _repositoryEmailMessage;
        private readonly IEnumerable<IHtmlFilter> _htmlFilters;
        private readonly RequestContext _requestContext;

        private const string TemplateName = "Parts/CorporateEmail";
        protected override string Prefix
        {
            get
            {
                { return "CorporateEmail"; }
            }
        }

        public IOrchardServices Services { get; set; }

        public CorporateEmailPartDriver(IRepository<EmailMessageRecord> repositoryEmailMessage)
        {
            _repositoryEmailMessage = repositoryEmailMessage;
        }

        public CorporateEmailPartDriver(IOrchardServices services, IEnumerable<IHtmlFilter> htmlFilters, RequestContext requestContext) {
            _htmlFilters = htmlFilters;
            Services = services;
            _requestContext = requestContext;
        }

        protected override DriverResult Display(CorporateEmailPart part, string displayType, dynamic shapeHelper)
        {
            return ContentShape(TemplateName, () => shapeHelper.Parts_CorporateEmail(CorporateEmailPart: part));
        }

        //GET
        protected override DriverResult Editor(CorporateEmailPart part, dynamic shapeHelper)
        {
            var model = BuildEditorViewModel(part);
            return ContentShape("Parts_CorporateEmail_Edit", () =>
                shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
        }

        //POST
        protected override DriverResult Editor(CorporateEmailPart part, IUpdateModel updater, dynamic shapeHelper)
        {
            updater.TryUpdateModel(part, Prefix, null, null);
            var model = BuildEditorViewModel(part);
            return ContentShape("Parts_CorporateEmail_Edit",
                                () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
        }

        #region Private Utilities

        private CorporateEmailEditorViewModel BuildEditorViewModel(CorporateEmailPart part)
        {
            return new CorporateEmailEditorViewModel
            {
                Alias = part.Alias,
                EmailAddress = part.EmailAddress,
                DisplayOrder = part.DisplayOrder,
                DisplayTitle = part.DisplayTitle,
                IsDefault = part.IsDefault,
                EmailMessageSummaries = part.EmailMessages.Select(ue => ue.Summary).ToList()
            };
        }

        #endregion
    }
}

非常感谢任何建议。

【问题讨论】:

    标签: orchardcms


    【解决方案1】:

    好的,头脑清晰的更仔细的调试会话,我发现了问题:

    在我的驱动程序中构建视图模型时出错:

    private CorporateEmailEditorViewModel BuildEditorViewModel(CorporateEmailPart part)
            {
                return new CorporateEmailEditorViewModel
                {
                    Alias = part.Alias,
                    EmailAddress = part.EmailAddress,
                    DisplayOrder = part.DisplayOrder,
                    DisplayTitle = part.DisplayTitle,
                    IsDefault = part.IsDefault,
                    EmailMessageSummaries = part.EmailMessages.Select(ue => ue.Summary).ToList()
                };
            }
    

    违规行是:

    EmailMessageSummaries = part.EmailMessages.Select(ue => ue.Summary).ToList()
    

    原因是使用 CorporateEmailPartRecord_Id 外键从 EmailMessageRecord 表中检索数据存在一些问题。我还没有弄清楚是什么(从未使用过 nHibernate,这是果园使用的),但是这个错误的存在回答了当前的问题。

    忠告:

    果园运作良好。

    事实上,它运作良好。

    模块中的代码不起作用。

    所以在调试时要更加小心。

    Kevin Kuebler 的视频是一个很棒的果园学习资源。

    当您重构某些东西的名称时,请仔细检查以确保它们已全部更改。

    附录:

    我找到了导致 hHibernate 错误的原因:伪劣重构。

    我最初将项目称为 CompanyEmails,但后来将所有内容都重构为 CorporateEmails。唯一的问题是,我没有重构所有东西,是吗? EmailMessageRecord 模型类上还有一个 CompanyEmailPartRecord_Id 字段,而在数据库中,我已将其更改为 CorporateEmailRecordPart_Id。所以,只是另一个错误,只是未能正确重构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-28
      • 2011-08-19
      • 2012-11-10
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多