我有一个客户控制器,负责处理客户的产品,信息以及什么不是。有些产品具有我想要处理的特殊化,所以需要一个这样做的过程。目前我在if
语句中进行了硬编码,以查看客户是否拥有该产品,如果有,则会添加额外的导航元素等。
我认为可能更好的方法是让Controller继承我的客户控制器,但增加了额外的功能。如果我能够在收到请求后检查哪个Customer派生控制器具有与请求匹配的函数,即ViewSpecialProduct
,然后调用该函数而不是vanilla客户控制器,那么它就非常好了。
有更简单的方法吗?如果不是我如何完成上述任务?我对路线和控制器初始化过程还不太了解。
由于
答案 0 :(得分:1)
您可以创建一个源自DefaultControllerFactory
的新控制器工厂,并覆盖GetControllerInstance
。我不确定你是如何进行客户检查的,但它可能看起来像这样:
public class CustomControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == typeof(DefaultProductController))
{
if(// is special customer)
return new SpecialProductController();
else
return new DefaultProductController();
}
}
}
然后通过ControllerBuilder.Current
在Global.asax Application_Start中设置新的ControllerFactory:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());
RegisterRoutes(RouteTable.Routes);
}
答案 1 :(得分:0)
由于它在生命周期中的位置,您可能不希望通过路由执行此操作。 MvcContrib具有可用于SubController http://jeffreypalermo.com/blog/mvccontrib-latest-release-now-with-subcontroller-support/的代码。此外,您可以通过将控制器工厂引用注入控制器,或者通过手动创建控制器并返回其操作来创建另一个控制器(但是如果您希望这样做,则必须记住使用ControllerContext对其进行初始化) )。