0

ASP.NET MVC 4で一連のイベントメッセージをリッスンするポストアクションを作成する必要があります。イベントがたくさんあるため、イベントごとにアクションを作成できません。したがって、投稿されたモデルはカスタムモデルバインダーを使用してイベントをハイドレイトするため、基本クラスでアクションを作成するのが最適です。

一部のイベントは次のようになります。

public class QueryID : Identity<Guid>
{
    public QueryID(Guid id)
    {
        Identifier = id;
    }
}

public class QueryEvent : IEvent<QueryID>
{
    public QueryEvent(QueryID id)
    {
        Identity = id;
    }

    #region Implementation of IEvent<out QueryID>

    public QueryID Identity { get; private set; }

    #endregion
}

public class QueryCreated : QueryEvent
{
    public string ConnectionID { get; private set; }

    public QueryCreated(QueryID id, string connectionID)
        : base(id)
    {
        ConnectionID = connectionID;
    }
}

public class ColumnAdded : QueryEvent
{
    public string Column { get; private set; }

    public ColumnAdded(QueryID id, string column)
        : base(id)
    {
        Column = column;
    }
}

これらのメッセージを受信するためのアクションメソッドは、次のようになります。

[HttpPost]
    public ActionResult Index(IEvent<IIdentity> e)
    {
        // whatever

        return new EmptyResult();
    }

基本IdentityクラスはIEvent<IIdentity>インターフェースを実装します。

これを実現するために、モデルバインダーはどのように見えますか?

ありがとう

4

2 に答える 2

1

ここでは、単なるモデル バインディングでは役に立ちません。モデル バインディングのしくみは、フレームワークがアクションが期待するパラメーターの型を調べ、リフレクションを使用してその型の既定のインスタンスを作成し、フォームで送信されたデータを使用してその型のすべてのパブリック プロパティをハイドレートすることです。

アクションのパラメーターはインターフェイスであるため、フレームワークはインスタンスの作成に失敗します。インターフェースのどの実装を作成すればよいのかわからないだけです。

ある例では、投稿されたフォームで非表示フィールドを使用して、インターフェイスのどの実装をアクション パラメーターにバインドするかを示しました。しかし、私には単純なシナリオがありました。2 つの実装を持つ 1 つのインターフェイス。それぞれがフォームに対応しています。したがって、モデル バインダーに作成させたいクラスの名前を非表示のフィールドに教えてもらうことができます。

あなたの場合、イベントの発信者(私が推測するクライアントアプリケーション)がどのモデルを呼び出す必要があるかを知っている場合、その情報を他の情報とともにアクションに送信できます。

残念ながら、現時点ではコードを持っていません。この解決策が役立つと思われる場合は、コードを掘り下げることができます。

于 2012-11-07T21:26:17.620 に答える
0

カスタムモデルバインダープロバイダーは、MVC3+のインターフェイスをサポートするように作成できます。この投稿を参照してください。

http://www.matthidinger.com/archive/2011/08/16/An-inheritance-aware-ModelBinderProvider-in-MVC-3.aspx

次に、特定のインターフェイスを継承するタイプは、関連するモデルバインダーに渡されます。このバインダーはas ConcreteClass、実際のタイプが何であるかを確認するために、nullチェックを試行する可能性があります。同様の問題があり、解決策を実行することはできませんが、関連する投稿は正しい方向を指しているように見えます。

于 2013-01-24T02:29:54.673 に答える