2011-03-01 9 views
0

私はURLを解析することによって、データベースからエンティティをロードするための汎用コントローラーファクトリを作成しました:複数のコントローラファクトリをロードし、次のコントローラに制御を渡すにはどうすればよいですか?

entity/products/123456.htm 

しかし、私は、エンティティが見つからない場合は、実際のコントローラをロードできるようにしたいのですが、または必要に応じて、URLパターンによって作成された「仮想」の代わりに物理コントローラを作成することによって、デフォルトのエンティティの動作を上書きすることができます。

今、global.asax.csに私がやっている:

ControllerBuilder.Current.SetControllerFactory(typeof(EntityControllerFactory)); 

私は、どちらか、またはここglobal.asax.csEntityControllerFactoryで、イベントでは、別の工場への制御を渡すことができますどのようにI引き継ぐMVCのデフォルトコントローラ/アクションスキームが好きですか?

答えて

3

あなたは、複合IControllerFactory実装作成することができます。デフォルトでControllerBuilder.Current.GetControllerFactory()の値がDefaultControllerFactoryのインスタンスであるため、

public class EntityControllerFactory : IControllerFactory { 
    private IControllerFactory defaultFactory = new DefaultControllerFactory(); 

    public IController CreateController(RequestContext requestContext, string controllerName) { 
     if(needsCustomLogic) { 
      // do your custom logic here and return appropriate result 
     } else { 
      return defaultFactory.CreateController(requestContext, controllerName); 
     } 
    } 

    // same for the other methods on IControllerFactory 
} 

この作品を。

また、デフォルトインスタンスを取得して工場に渡すことで、新しいバージョンのMVCがGetControllerFactoryから別のタイプの戻り値を返すようになる可能性もあります。

// in Global.asax 
var defaultFactory = ControllerBuilder.Current.GetControllerFactory(); 
ControllerBuilder.Current.SetFactory(new EntityControllerFactory(defaultFactory)); 
関連する問題