3

私の Orchard のインスタンスには、カスタム コンテンツ パーツを持つカスタム コンテンツ タイプがあります。コンテンツ パーツの「エディター ドライバー」では、コンテナー コンテンツ アイテムが有効かどうか (つまり、検証に合格するかどうか) を確認する必要があります。

通常の ModelState は、Orchard のしくみのため、ここでは機能しません。コンテンツ パーツが有効かどうかは判断できますが、コンテンツ アイテム全体について知る必要があります (コンテンツ アイテム内には他のコンテンツ パーツがあります)。

ライフサイクル イベント ( http://docs.orchardproject.net/Documentation/Understanding-content-handlers ) を使用してコンテンツ パーツが公開/作成された後にコードを実行する方法があることは知っていますが、(私が知っている) 方法はありません。それらのイベント情報を渡します。

基本的に、コンテンツ アイテムが有効な場合にメソッドを実行する必要があり、ViewModel 内に含まれるメソッド情報を渡す必要があります。

これを行うためのより良い方法があるかもしれません (おそらくそうです) が、Orchards フレームワーク内で方法を見つけるのに苦労しています。

サンプルコード:

//POST
protected override DriverResult Editor(EventPart part, IUpdateModel updater, dynamic shapeHelper)
{
    var viewModal = new EventEditViewModel();

    if (updater.TryUpdateModel(viewModal, Prefix, null, null))
    {
        part.Setting = viewModal.Setting;
    }

    //here's where I need to check if the CONTENT ITEM is valid or not, for example
    if (*valid*)
    {
        DoSomething(viewModal.OtherSetting);
    }

    return Editor(part, shapeHelper);
}

注: Orchard バージョン 1.6 を使用しています。

4

1 に答える 1

4

残念ながら、ドライバーの内部からそれを行う簡単な方法はありません。早すぎる。を実行して他の部分にアクセスできますpart.As<OtherPart>が、この時点ではまだ更新されている場合とされていない場合があります。

OnPublishing次のように、ハンドラと/ OnPublished(およびその他の) イベントを利用してみてください。

        OnPublishing<MyPart>((ctx, part) =>
        {
            // Do some validation checks on other parts
            if (part.As<SomeOtherPart>().SomeSetting == true)
            {
                notifier.Error(T("SomeSetting cannot be true."));
                transactions.Cancel();
            }
        });

インスタンスは、ctor に挿入されますtransactionsITransactionManager

さらに制御が必要な場合は、アイテムの更新/作成を処理するための独自のコントローラーを作成するのが最善の方法です。

これを行うには (コントローラーが既に配置されていると仮定します)、ハンドラーOnGetContentItemMetadataメソッドを使用して、次のように、デフォルトのコントローラーではなくコントローラーを使用するように Orchard に指示する必要があります。

        OnGetContentItemMetadata<MyPart>((context, part) =>
        {
            // Edit item action
            context.Metadata.EditorRouteValues = new RouteValueDictionary {
            {"Area", "My.Module"},
            {"Controller", "Item"},
            {"Action", "Edit"},
            {"id", context.ContentItem.Id}};

            // Create new item action
            context.Metadata.CreateRouteValues = new RouteValueDictionary {
            {"Area", "My.Module"},
            {"Controller", "Item"},
            {"Action", "Create"});
        });
于 2013-01-15T04:43:11.720 に答える