ASP.NET MVC 从IHttp到页面输出的实例代码
ASP.NET MVC 从IHttp到页面输出的实例代码
发布时间:2016-12-29 来源:查字典编辑
摘要:复制代码代码如下:MVCHandler:IHttpHandlervoidIHttpHandler.ProcessRequest(HttpCo...

复制代码 代码如下:

MVCHandler : IHttpHandler

void IHttpHandler.ProcessRequest(HttpContext httpContext)

{

this.ProcessRequest(httpContext);

}

protected virtual void ProcessRequest(HttpContext httpContext)

{

HttpContextBase base2 = new HttpContextWrapper(httpContext);

this.ProcessRequest(base2);

}

protected internal virtual void ProcessRequest(HttpContextBase httpContext)

{

IController controller;

IControllerFactory factory;

this.ProcessRequestInit(httpContext, out controller, out factory);

try

{

controller.Execute(this.RequestContext);

}

finally

{

factory.ReleaseController(controller);

}

}

复制代码 代码如下:

Controller : ControllerBase : IController

void IController.Execute(RequestContext requestContext) //------>Controller

{

this.Execute(requestContext);

}

protected virtual void Execute(RequestContext requestContext) //------>ControllerBase

{

if (requestContext == null)

{

throw new ArgumentNullException("requestContext");

}

if (requestContext.HttpContext == null)

{

throw new ArgumentException(MvcResources.ControllerBase_CannotExecuteWithNullHttpContext, "requestContext");

}

this.VerifyExecuteCalledOnce();

this.Initialize(requestContext);

using (ScopeStorage.CreateTransientScope())

{

this.ExecuteCore();

}

}

protected override void ExecuteCore() //------>Controller

{

this.PossiblyLoadTempData();

try

{

string requiredString = this.RouteData.GetRequiredString("action");

if (!this.ActionInvoker.InvokeAction(base.ControllerContext, requiredString)) //public IActionInvoker ActionInvoker { get; set; }

{

this.HandleUnknownAction(requiredString);

}

}

finally

{

this.PossiblySaveTempData();

}

}

复制代码 代码如下:

ControllerActionInvoker : IActionInvoker

public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)

{

if (controllerContext == null)

{

throw new ArgumentNullException("controllerContext");

}

if (string.IsNullOrEmpty(actionName))

{

throw new ArgumentException(MvcResources.Common_NullOrEmpty, "actionName");

}

ControllerDescriptor controllerDescriptor = this.GetControllerDescriptor(controllerContext);

ActionDescriptor actionDescriptor = this.FindAction(controllerContext, controllerDescriptor, actionName);

if (actionDescriptor == null)

{

return false;

}

FilterInfo filters = this.GetFilters(controllerContext, actionDescriptor);

try

{

AuthorizationContext context = this.InvokeAuthorizationFilters(controllerContext, filters.AuthorizationFilters, actionDescriptor);

if (context.Result != null)

{

this.InvokeActionResult(controllerContext, context.Result);

}

else

{

if (controllerContext.Controller.ValidateRequest)

{

ValidateRequest(controllerContext);

}

IDictionary<string, object> parameterValues = this.GetParameterValues(controllerContext, actionDescriptor);

ActionExecutedContext context2 = this.InvokeActionMethodWithFilters(controllerContext, filters.ActionFilters, actionDescriptor, parameterValues);

this.InvokeActionResultWithFilters(controllerContext, filters.ResultFilters, context2.Result);

}

}

catch (ThreadAbortException)

{

throw;

}

catch (Exception exception)

{

ExceptionContext context3 = this.InvokeExceptionFilters(controllerContext, filters.ExceptionFilters, exception);

if (!context3.ExceptionHandled)

{

throw;

}

this.InvokeActionResult(controllerContext, context3.Result);

}

return true;

}

protected virtual void InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)

{

actionResult.ExecuteResult(controllerContext);

}

复制代码 代码如下:

ActionResult

public override void ExecuteResult(ControllerContext context)

{

if (context == null)

{

throw new ArgumentNullException("context");

}

if (string.IsNullOrEmpty(this.ViewName))

{

this.ViewName = context.RouteData.GetRequiredString("action");

}

ViewEngineResult result = null;

if (this.View == null)

{

result = this.FindView(context); //ViewEngineResult

this.View = result.View; //IView接口

}

TextWriter output = context.HttpContext.Response.Output;

ViewContext viewContext = new ViewContext(context, this.View, this.ViewData, this.TempData, output);

this.View.Render(viewContext, output);

if (result != null)

{

result.ViewEngine.ReleaseView(context, this.View);

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类