1

外部リポジトリから情報をフェッチするカスタム コンテンツ パーツを構築しています。ほとんどの場合、@ Orchard レコード リポジトリを変更する方法と、カスタム ハンドラを使用してデータをフェッチする方法に関するアドバイスに従っています。

外部データ ストアを操作すると、あらゆる種類のネットワーク例外などが発生する可能性が生じ、基になるレコードが保存されなくなります。ただし、 で例外がスローされた場合ContentHandlerは、メソッドによって飲み込まれ、Invoke<TEvents>(「致命的な」例外でない限り) ユーザーは例外を認識せず、実際には例外が発生していないのに、 AdminControllerthatによって通知されます。"Your {0} has been saved."されていません。

私にとって明らかな回避策は、何らかの方法でエラーを傍受し、実行中のAdminController. その時点で、コントローラーにフックしてModelStateエラーを発生させることができます。エラーはキャッチされ、誤検知通知なしでエラーが通知されます。

ModelStateコンテンツ ドライバーを介してコントローラーを変更するよりも、この種の外部アクセスを適切に処理できる Orchard で利用可能な他の拡張ポイントはありますか?

4

1 に答える 1

1

最も簡単な方法は、これらのエラーに対して独自のシンプルなリクエストごとのストレージ オブジェクトを実装することです。

public interface IErrorLog : IDependency {
    public void Add(string message){ ... }
    public IEnumerable<string> List() { ... }
}

public class DefaultErrorLog : IErrorLog { ... }

IErrorLogコントローラーとハンドラーの両方に挿入します。ハンドラーで、キャッチする必要があるすべてのエラーをキャッチし、 でコレクションに追加しますAdd(...)。次に、コントローラーで、List()各エントリのモデル エラーを呼び出して追加します。

アップデート

Controllerコンテンツ アイテムを更新する を制御できない場合は、ドライバーを使用する必要があります。アイテムの保存中に例外をキャッチし ( Editor3 つのパラメーターを持つ 2 番目のメソッド) AddModelError、提供されたIUpdateModelオブジェクトを使用してエラー情報をプッシュします。はるかに簡単ですが、アイテムが保存されたときに発生するエラーのみをキャッチできます。

更新 2

コンテンツ アイテムを更新するを制御できないControllerが、純粋なソリューションを使用してプロセス全体を制御したい場合は、独自のコントローラーを使用してアイテムを編集できます。それを行うには:

  • 最初に新しいコントローラーを作成します (または、にあるデフォルトをコピーして変更しますAdminController) Orchard.Core\Contents
  • ここで、カスタム パーツを含むすべてのタイプに対して、既定のコントローラーではなく、このコントローラーを使用するように Orchard に指示します。これは、ハンドラーに次のようなものを入れることで実行できます。

    OnGetContentItemMetadata<MyCustomPart>((context, part) =>
    {
        context.Metadata.AdminRouteValues = new RouteValueDictionary 
        {
            { "Area", "My.Module" },
            { "Controller", "Admin" },
            { "Action", "Edit" },
            { "id", context.ContentItem.Id }
        };
    });
    
于 2013-05-07T20:28:26.850 に答える