一共有 5 个控制器。
1. ContentCotroller
1: [Controls(typeof(AbstractPage))]
2: public class ContentController : ContentController
3: {
4: }
Controls特性指定控制器要使用哪种类型的内容项(模型),这里指定的是AbstractPage,而不是ContentPage,说明它可以使用任何一种内容项,不过有些内容项已经有对应的控制器了,只有没有对应控制器的内容项才会被这个控制器使用。
另外可以看出,控制器的父类被指定为ContentController,这是N2中定义的控制器类,这个类中实现了Index方法(虚拟方法),对于普通内容项已经够用,所以这里不需要重写了。
2. NewsController
1: [Controls(typeof(NewsPage))]
2: public class NewsController : ContentController
3: {
4: public override ActionResult Index()
5: {
6: var vd = new NewsViewData
7: {
8: News = CurrentItem,
9: Back = CurrentItem.Parent,
10: Comments = CurrentItem.GetComments()
11: };
12: return View("index", vd);
13: }
14:
15: public ActionResult Comment()
16: {
17: return View("Comment", CurrentItem);
18: }
19:
20: public ActionResult Submit(string title, string text)
21: {
22: CommentItem comment = Engine.Definitions.CreateInstance(CurrentItem);
23: comment.Title = Server.HtmlEncode(title);
24: comment.Text = Server.HtmlEncode(text);
25: Engine.Persister.Save(comment);
26:
27: return RedirectToAction("index");
28: }
29: }
它控制新闻内容及其评论内容的所有请求和处理,包括获取某条新闻及其对它的所有评论、显示添加评论表单和提交评论。注意这里用到了NewsViewData类,这是视图数据类,它提供了新闻所需要的包括自己在内的必要信息,这个类在下篇中会看到代码。
Index方法在这里重写了,因为显示新闻内容的时候,还需要显示针对此新闻的所有评论和其他的一些辅助内容,比如后退到哪里,所以另外定义了专门的NewsViewData类来存储这些数据,并绑定到视图中。
Comment方法响应GET请求,它把添加评论的视图返回到浏览器让用户能够输入评论。
Submit方法响应POST请求,它负责创建一条评论对象并持久化。Engine.Definitions.CreateInstance(CurrentItem)的作用是在当前新闻内容项的子结点中添加一个评论项对象,设置了标题和文本之后,通过Engine.Persister.Save()方法把这个评论持久化到数据源中。最后回到新闻页面。
这里需要好好研究Engine对象,它提供了许多管理N2所必需的功能,如果以后要深度定制CMS的话,肯定会用的到。
3. NewsContainerController
1: [Controls(typeof(NewsContainer))]
2: public class NewsContainerController : ContentController
3: {
4: public override ActionResult Index()
5: {
6: return View("Index", new NewsContainerViewData { Container = CurrentItem, News = CurrentItem.GetNews()});
7: }
8:
9: public ActionResult JsonList()
10: {
11: var news = CurrentItem.GetNews().Select(n => new { n.Title, n.Url });
12: return Json(news);
13: }
14: }
这个控制器的作用就是获取所有的新闻,然后传给新闻容器视图。这里也用到了视图数据类,NewsContainerViewData,它存储了新闻容器项和所有的新闻列表。
这里还定义了一个JsonList方法,返回JSON格式的新闻列表,不知道会在哪里用到。
4. TextPartController
1: [Controls(typeof(Models.TextPart))]
2: public class TextPartController : ContentController
3: {
4: public override ActionResult Index()
5: {
6: return View(CurrentItem);
7: }
8: }
这里没有什么好说的,我感觉Index没有必要重写,因为父类的Index方法就是这样写的。
5. StaticController
代码不需要贴了,这个类没有用到N2的任何代码,似乎就是用VS新建的MVC项目中的HomeController改的。它不受N2的任何控制,也不会在N2的管理界面中出现,不过它可以和N2共存。