Kooboo CMS

  今天决定写一篇好一点的文章,吼吼!首先我们必须找到这个文件,这个文件是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的名字啊。

到此为止,新增用户的操作就完成了,不过我还是感到一头雾水啊。。。。。。也许是我太笨了吧。

原文地址:https://www.cnblogs.com/kmsfan/p/Kooboo_CMS_Register_New_User.html