今天决定写一篇好一点的文章,吼吼!首先我们必须找到这个文件,这个文件是UsersController.cs,我们找到和添加新用户有关的方法,如下代码:
public virtual ActionResult Create() { return View(); } [HttpPost] public virtual ActionResult Create(CreateUserModel model, string @return) { var data = new JsonResultData(ModelState); if (ModelState.IsValid) { data.RunWithTry((resultData) => { UserManager.Add(model.ToUser()); data.RedirectUrl = @return; }); } return Json(data); }
注意到这是一个虚方法,我指的是后面的POST请求带来的方法。
我们可以看到CreateUserModel里面有这些东西。这些东西都是我从VIEW里面带过来的。
这个jsonResultEntry就是我们的LAMBDA表达式左边的部分。
而里面的Action<JsonResultData>其实是一个匿名的委托方法。要说这2个东西,其实我个人感觉很有渊源啊,看下面的图
其实这个jsonResultEntry就是一个形式参数的入口。
我们打开这里面进行查看
{Method = {Void <Create>b__4(Kooboo.CMS.Common.JsonResultData)}}
不过为什么呢?既然这个方法是一个带参数的JsonResultData类型的。哈哈,我也不知道了。
下面是打断点到这之后的结果。
好吧,下面继续,居然到了这个方法。贴代码:
protected override void InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) { if (actionResult is FileResult) { controllerContext.HttpContext.Response.RestoreRawOutput(); } base.InvokeActionResult(controllerContext, actionResult); }
大家注意到了没有,这里居然有一个override的方法,这证明我们自己写了一个方法去覆盖系统原有的。
后面的ACTIONRESULT就是刚刚前一步返回的ActionResult.
下面的FILERESULT暂时不管。
哈哈,到这一步我才知道,原来最终还是调用基类的方法哦,我就说阿不咋这么叼,自己开始改MVC底层了,汗死。
进行了若干步骤以后。。。。到了一个httpapplicationHooker方法里面,执行这个方法。
public virtual void Application_EndRequest(object sender, EventArgs e) { RunEvents((events) => { events.Application_EndRequest(sender, e); }); }
嘿嘿,这个RunEvent是底层的方法,被我发现了。
protected virtual void RunEvents(Action<IHttpApplicationEvents> action) { var events = EngineContext.Current.ResolveAll<IHttpApplicationEvents>(); foreach (var item in events) { action(item); } }
当我看到这个ResolveAll以后,我第一反应就是“依赖注入,控制反转”。当然这里我不深入研究。
我们看下面的
这里相当于循环执行了容器里面的所有方法,不然对不起这个RunEvent的名字啊。
到此为止,新增用户的操作就完成了,不过我还是感到一头雾水啊。。。。。。也许是我太笨了吧。