[英]Where are Controllers' actions executed in a CustomControllerFactory in ASP.NET MVC?
我正在学习ASP.NET MVC,我只是为了了解应用程序流程而创建了一个自定义控制器工厂。
以下是我的自定义控制器工厂的代码。
我的问题是,虽然在此操作中未调用控制器的操作,但确实可以执行该操作。 它如何发生以及在何处发生?
当我不从工厂调用时,如何执行Index操作?
using System.Web.Routing;
using System.Web.SessionState;
public class CustomControllerFactory : IControllerFactory
{
public IController CreateController(
RequestContext requestContext,
string controllerName)
{
Type targetType = null;
switch (controllerName)
{
case "first":
case "home":
targetType = typeof(FirstController);
break;
case "second":
targetType = typeof(SecondController);
break;
}
var typ = targetType.GetType();
return Activator.CreateInstance(targetType) as IController;
}
public SessionStateBehavior GetControllerSessionBehavior(
RequestContext requestContext,
string controllerName)
{
return System.Web.SessionState.SessionStateBehavior.Default;
}
public void ReleaseController(IController controller)
{
IDisposable dispose = controller as IDisposable;
if(dispose!= null)
dispose.Dispose();
}
}
而我的FirstController
代码如下:
public class FirstController : Controller
{
//
// GET: /First/
public ActionResult Index()
{
return Content("first cotnroller");
}
}
ControllerFactory
仅负责创建所讨论的控制器的实例,通常是实现DI变量以实例化控制器的地方。
执行动作是请求执行流程中的下一步。 它由ControllerActionInvoker
通过InvokeAction
方法完成 ,
public virtual bool InvokeAction(
ControllerContext controllerContext,
string actionName
)
如图所示,该控件随提供了controllerContext
提供,该实例提供控制器类的实例(即FirstController
)以及要执行的操作的名称,在本例中为"Index"
。
如果您还希望实现ActionInvoker
的自定义版本,则可以通过实现IActionInvoker
接口 ,并将每个控制器的ActionInvoker
属性设置为CustomActionInvoker
的实例来实现。
this.ActionInvoker = new CustomActionInvoker();
在控制器的构造函数中(也许在所有其他控制器继承的BaseController
构造函数中)。
有关ASP.NET MVC应用程序的整个执行流程,请参考此答案 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.