0

設定:

クライアントが自社のメールをコンテンツとして管理できるように、モジュールを作成しています。

人々の実際の電子メール アドレスを公開 Web サイトに掲載することを避けるため、Web サイト ユーザーが電子メールを送信するには、Orchard にフォームを表示させます。それで問題ありません。私の問題 (以下を参照) は、Orchard がWeb サイトの公開部分ではなく、ダッシュボードにコンテンツ アイテムを表示する方法に関連しています。

次に進む:

EmailAddress というコンテンツ タイプを作成しました (下記の migration.cs を参照)。これは基本的に、CorporateEmailPart と呼ばれるコンテンツ パーツの単なるコンテンツ タイプ ラッパーです。

セットアップのその他の関連部分はドライバーです (以下の CorporateEmailPartDriver.cs を参照)。PluralSight.com の Kevin Kuebler のビデオに従って、ドライバーを作成しました。デバッグは、正常に動作していることを示しています。

形状は、私のモジュールの Placement.info ファイルを使用して配置されます。

だから、それがなければすべてうまくいくだろう...

問題:

ドライバーを使用すると、コンテンツ タイプのエディターのシェイプを正しく作成でき、問題なく表示されます。

というか、問題なく表示され、新しい EmailAddress を作成できます。CorporateEmailPart をデータベースに問題なく保存できます。

しかし、新しい EmailAddress コンテンツ タイプを保存するか、既存のものを編集しようとすると、CorporateEmailPart のフィールドが EmailAddress エディターにまったく表示されません。

つまり、POST DriverResult Editor メソッドで GET Editor ContentShape を返すと、コンテンツ タイプの 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
    }
}

どんな提案でも大歓迎です。

4

1 に答える 1

3

OK、明確な心でより慎重なデバッグセッションを行ったところ、問題が見つかりました:

ドライバーでビューモデルをビルドすると、エラーが発生します。

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 に変更しました。つまり、別のバグ、適切なリファクタリングの失敗です。

于 2012-07-11T08:46:41.920 に答える