6

設定ページに表示されるオーチャードで簡単な設定を作成しようとしています。ContentPart を設定ページに追加し、データベースにテーブルを正しく作成するモジュールを作成しましたが、cshtml ファイルがレンダリングされ、レコードのプロパティにアクセスするたびに、次の NHibernate レコードを取得し続けます。

次のパーシスタはありません: TekFlow.Contact.TekFlowEmailSettingsPartRecord。(TekFlow.Contact はモジュール名です)

以下は、Orchard で必要な Record/Part/Handler/Driver を作成するために使用しているすべてのコードです。

 public class TekFlowEmailSettingsPartDriver : ContentPartDriver<TekFlowEmailSettingsPart>
{
    public TekFlowEmailSettingsPartDriver()
    {
        T = NullLocalizer.Instance;
    }

    public Localizer T { get; set; }

    protected override DriverResult Editor(TekFlowEmailSettingsPart part, dynamic shapeHelper)
    {
        return ContentShape("Parts_TekFlowEmailSettings_Edit",
            () => shapeHelper.EditorTemplate(TemplateName: "Parts.TekFlowEmailSettings", Model: part, Prefix: Prefix)
                );
    }

    protected override DriverResult Editor(TekFlowEmailSettingsPart part, Orchard.ContentManagement.IUpdateModel updater, dynamic shapeHelper)
    {
        bool success = updater.TryUpdateModel(part, Prefix, null, null);
        return Editor(part, shapeHelper);
    }
}

[UsedImplicitly]
public class TekFlowEmailSettingsPartHandler : ContentHandler
{
    public TekFlowEmailSettingsPartHandler(IRepository<TekFlowEmailSettingsPartRecord> repository)
    {
        Filters.Add(new ActivatingFilter<TekFlowEmailSettingsPart>("Site"));
        Filters.Add(StorageFilter.For(repository));
    }
}

 public class TekFlowEmailSettingsPartRecord : ContentPartRecord {
     public virtual string SendToEmail { get; set; }
}

 public class TekFlowEmailSettingsPart : ContentPart<TekFlowEmailSettingsPartRecord>
 {
     public string SendToEmail
     {
         get { return Record.SendToEmail; }
         set { Record.SendToEmail = value; }
     }
 }

 public class TekFlowEmailSettingsDataMigration : DataMigrationImpl
 {
     public int Create()
     {
         SchemaBuilder.CreateTable("TekFlowEmailSettingsPartRecord",
             table => table
                 .ContentPartRecord()
                 .Column<string>("SendToEmail", c => c.WithDefault("SomeEmail@somedomain.com").WithLength(255))
             );


         ContentDefinitionManager.AlterPartDefinition(
             typeof(TekFlowEmailSettingsPart).Name, cfg => cfg.Attachable());

         return 1;
     }
 }
4

3 に答える 3

14

Part と Record が "Models" 名前空間にない場合、これは果樹園では機能しないことが判明しました。2 つのクラスの名前空間を変更すると、機能しました。オーチャードが行っている仮定に違いありません。

于 2011-02-15T18:57:53.530 に答える
2

レコードに仮想変数がないことから同じエラーが発生しました。(私の場合、それは ContentPartRecord を継承せず、独自の Id であると宣言しました。問題が単に Id が仮想ではないことなのか、それともすべての変数が仮想でなければならないことなのかはわかりません。)

また、前述のように、ここで説明されているように、名前空間はモデルまたはレコードで終わる必要があります: https://orchard.codeplex.com/discussions/267968

于 2014-06-27T07:48:37.650 に答える
0

私の Favicon モジュールの構造はほぼ同じで、ファイルごとに比較したところ、大きな違いは見つかりませんでした。疑わしいと思われる唯一のことは、ドライバーでプレフィックスを定義していないことです。これは、モデルを再水和するバインダーの機能を妨げる可能性がありますが、それが永続性にどのように影響するかはわかりません.

于 2011-02-14T23:06:10.650 に答える