`
netatomy
  • 浏览: 46800 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

N2CMS Mvc Examples 学习记录 (4) – 母版页和视图

 
阅读更多

看母版页和视图会看到很多呈现方面的细节,包括如何使用N2的一些工具类来生成导航菜单、站点路径,如何在页面中放一个Zone(用于容纳Parts),以及如何显示模型对象的数据。不过N2CMS的API文档不是很详细,甚至根本没有说明,有时候不容易想出来一些方法具体实现的什么功能。

1. 母版页(Site.Master)

(1)显示管理工具栏

   1: n2:SlidingCurtain runat="server">
<!--CRLF-->
   2:     n2:DragDropControlPanel runat="server" />
<!--CRLF-->
   3: n2:SlidingCurtain>
<!--CRLF-->

加上这段代码,管理员登录后可以在页面左看到管理面板工具栏。

(2)生成导航菜单

   1: ul id="mainMenu">
<!--CRLF-->
   2:     li>a href="">Homea>li>
<!--CRLF-->
   3:     <%= N2.Web.Tree.From(N2.Find.StartPage, 2).Filters(new N2.Collections.NavigationFilter()).ExcludeRoot(true)%>
<!--CRLF-->
   4:     li><%= Html.ActionLink("Static controller", "Items", "Static", new { id = "from the menu" }, null)%>li>
<!--CRLF-->
   5: ul>
<!--CRLF-->

N2.Find.StartPage获取到起始页(即首页)的内容项。

N2.Web.Tree.From从指定内容项(这里是起始页)开始查找树结果,查找的深度为2层,并从中用导航过滤器找到所有的内容项,再排除根(即起始页,这个已经显示过了),最后以LI呈现出来。

(3)左边栏内容

   1: div class="leftColumn">
<!--CRLF-->
   2:     h2><%= N2.Utility.Evaluate(N2.Find.AtLevel(N2.Find.CurrentPage, N2.Find.StartPage, 2), "Title") %>h2>
<!--CRLF-->
   3:     ul>
<!--CRLF-->
   4:         <%= N2.Web.Tree.Between(N2.Find.CurrentPage, N2.Find.StartPage, true, 2).Filters(new N2.Collections.NavigationFilter()).ExcludeRoot(true) %>
<!--CRLF-->
   5:     ul>
<!--CRLF-->
   6:     <% Html.DroppableZone("Left").Render(); %>
<!--CRLF-->
   7: div>--/leftColumn-->
<!--CRLF-->

N2.Find.AtLevel(N2.Find.CurrentPage, N2.Find.StartPage, 2),第一个参数(当前页)是终点(子结点),第二个参数(起始页)是起点(父结点),这两个参数构成了一个树,在这个树结构内从起点确定深度为2级的项,然后用N2.Utility.Evaluate尝试获取它的标题。

N2.Web.Tree.Between(N2.Find.CurrentPage, N2.Find.StartPage, true, 2)应该是找出前两个参数之间的项,第三个参数不是很理解,第四个参数表示开始的层次,这里是从第2层开始,即起始页将不在内。找出来的项不一定都要显示出来,比如新闻容器下的新闻项就不应该显示出来,另外这些项的根顶也不需要,所以后面的工作就是过滤和排除,最后把项用LI呈现。

最后的是在此处呈现一个名为"Left"的Zone,这里可以在管理界面中把TextPart放到这里。

(4)右边栏内容

   1: div class="rightColumn">
<!--CRLF-->
   2:     p>
<!--CRLF-->
   3:     <% foreach(N2.ContentItem item in N2.Find.EnumerateBetween(N2.Find.StartPage, N2.Find.CurrentPage, false)) { %>
<!--CRLF-->
   4:         <%= N2.Web.Link.To(item) %> /
<!--CRLF-->
   5:     <% } %>
<!--CRLF-->
   6:     <%= N2.Utility.Evaluate(N2.Find.CurrentPage, "Title") %>
<!--CRLF-->
   7:     p>
<!--CRLF-->
   8:     asp:ContentPlaceHolder ID="MainContentPlaceHolder" runat="server">
<!--CRLF-->
   9:     asp:ContentPlaceHolder>
<!--CRLF-->
  10: div>--/rightColumn-->
<!--CRLF-->

N2.Find.EnumerateBetween(N2.Find.StartPage, N2.Find.CurrentPage, false)返回两个内容项之间的所有项的迭代(IEnumerable<contentitem>),false排除了最深层的页面,即当前页面。显示到这些项的链接。最后显示当前页的标题:。</contentitem>

下面的占位符把呈现工作交给各个视图模板来实现了。

2. 视图模板

(1)Content/Index.aspx

   1: " %>
<!--CRLF-->
   2: 
<!--CRLF-->
   3: asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
<!--CRLF-->
   4: h1> %= Model.Title % >h1>
<!--CRLF-->
   5:  %= Model.Text % >
<!--CRLF-->
   6: asp:Content>
<!--CRLF-->

显示ContentPage中的标题(Title)和文本(Text),后者本身就是富文本,直接显示就行了。

(2)News/*

a. News.aspx

   1:  " %>
   2:  
   3:  asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
   4:      h1>= Model.News.Title %>h1>
   5:      = Model.News.Text%>
   6:      div class="comments">
   7:       foreach (MvcTest.Models.CommentItem comment in Model.Comments){ %>
   8:          div>
   9:              h3>= comment.Title %>h3>
  10:              = comment.Text %>
  11:          div>
  12:      } %>
  13:      div>
  14:      hr />
  15:      = N2.Web.Link.To(Model.Back).Text("Back").Class("back") %>
  16:      = Html.ActionLink("Comment", "Comment", new { @class = "comment" }) %>
  17:  asp:Content>
<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>

(换了个插入代码的插件,原来用的也挺好,不过对支持不好,现在好了。)

这里用到了NewViewData类,定义如下:

   1:  public class NewsViewData
   2:  {
   3:      public ContentItem Back { get; set; }
   4:      public NewsPage News { get; set; }
   5:      public IEnumerable<commentitem> Comments { get; set; }</commentitem>
   6:  }
<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>

控制器负责创建NewsViewData而不是NewsPage的实例并传递给视图。

视图模板中的第15行显示后退到新闻列表页面的链接,第16行则产生到添加评论表单的链接,写法不同。

b. Comment.aspx

   1:  " %>
   2:  
   3:  
   4:  asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
   5:       Html.BeginForm("Submit", "News"); %>
   6:          h1>= string.Format("Add comment to '{0}'", Model.Title) %>h1>
   7:          p>
   8:              label>Subjectlabel>
   9:              = Html.TextBox("title") %>
  10:          p>
  11:          p>
  12:              label>Commentlabel>
  13:              = Html.TextArea("text", "") %>
  14:          p>
  15:          p>
  16:              input type="submit" />
  17:              = Html.ActionLink("Back", "index") %>
  18:          p>
  19:       Html.EndForm(); %>
  20:  asp:Content>

这个表单会提交给NewsController的Submit这个Action,最终被存储到数据库中。

(3)NewsContainer/Index.aspx

   1:  " %>
   2:  
   3:  asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
   4:      h1>= Model.Container.Title %>h1>
   5:      ul class="newsList">
   6:       foreach (MvcTest.Models.NewsPage item in Model.News) { %>
   7:          li>= N2.Web.Link.To(item) %>li>
   8:       } %>
   9:      ul>
  10:  asp:Content>

新闻容器页面,显示新闻项列表。这里也用到了视图数据类,NewsContainerViewData:

   1:  public class NewsContainerViewData
   2:  {
   3:      public Models.NewsContainer Container { get; set; }
   4:      public IEnumerable<newspage> News { get; set; }</newspage>
   5:  }
<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>

不必多说,继续。<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>

(4)TextPart/Index.ascx

   1:  
   2:  = Html.DisplayContent("Text") %>
<style type="text/css"> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }</style>

它可以嵌入到母版页中左边栏上定义的Zone内。

分享到:
评论

相关推荐

    n2cms开源免费

    - **examples**:示例代码或配置文件,帮助开发者理解和学习 N2CMS 的各种功能。 - **lib**:库文件夹,包含了 N2CMS 运行所依赖的外部库和框架。 - **build**:构建相关的文件,如构建脚本或编译配置,用于生成可...

    N2cms内容管理系统

    4. docs:该目录可能包含了项目的文档,包括用户手册、API参考、教程等,是学习和理解N2cms功能的重要资源。 5. examples:这里可能存放了一些示例或者模板,帮助用户了解如何使用N2cms来创建和管理内容,或者如何...

    Ext.NET.MVC.Pro.2.2.0.MVC.Examples.Explorer.zip

    开发者可以查看控制器、视图和模型的实现,了解如何在ASP.NET MVC项目中集成Ext.NET组件,并且学习如何处理各种事件和数据绑定。 5. **Demo**: 示例涵盖了各种Ext.NET MVC控件的用法,如表格(GridPanel)、窗体...

    asp.net mvc 4 web编程 源代码

    总之,这些代码示例涵盖了ASP.NET MVC 4开发的多个方面,从基本的MVC架构理解到高级特性的应用,为深入学习和实践提供了丰富的资源。通过研究这些章节,读者可以逐步掌握如何构建高效、可维护的Web应用程序。

    Ext.NET.MVC.Pro.2.5.1.MVC.Examples.Explorer

    Ext.NET.MVC.Pro.2.5 Examples

    Ext.NET.MVC.Pro.2.4.0.MVC.Examples.Explorer

    4. **MVC控制器与视图**:理解MVC模式中的控制器和视图如何与Ext.NET组件交互,示例可能包含自定义的控制器动作来响应客户端请求。 5. **数据库连接**:如果示例涉及到数据库操作,可能需要配置数据库连接字符串,...

    【在线示例源码】FineUIMvc-Examples-v8.2.1.zip

    【在线示例源码】FineUIMvc_Examples_v8.2.1,【在线示例源码】FineUIMvc_Examples_v8.2.1【在线示例源码】FineUIMvc_Examples_v8.2.1,

    ASP.NET MVC4 Web 编程 源代码

    描述"《ASP.NET MVC 4 Web编程》的源代码"意味着,这些代码实例可能覆盖了以上所有知识点,通过阅读和学习这些源代码,开发者能够深入理解ASP.NET MVC4框架的工作原理,掌握如何在实际项目中运用这些技术。...

    ASP.NET+MVC4+Web+编程.rar

    "CodeExamples-Chapter_01"通常介绍MVC的基本概念和第一个应用程序的创建,可能包括视图的布局、视图数据的传递以及控制器的初始化。 "CodeExamples-master"可能包含主布局文件(_Layout.cshtml),它是所有视图...

    ASP.NET MVC 4 高级编程 源码

    《ASP.NET MVC 3 高级编程》主要内容是描述视图的概念,探讨Razor语法、NuGet、单元测试等,解释控制器在MVC框架中的作用,以及模型在绑定和数据访问策略中发挥的作用,演示如何显示和处理表单,涵盖添加到April ...

    Servlet,JSP和Spring MVC 初学指南源码

    在这个名为“budi-kurniawan-servlet-jsp-springmvc-examples-4754f4ab5d5c”的压缩包中,可能包含了各种示例代码,涵盖了Servlet、JSP和Spring MVC的基本用法和组合应用。例如: 1. Servlet示例:展示了如何创建和...

    STM32F4discovery examples

    总之,"STM32F4discovery examples"为STM32F4系列微控制器的学习提供了丰富的资源,涵盖了从基础到高级的各种应用场景,是开发者入门和精通STM32F4的好帮手。通过深入学习和实践这些示例,可以提升嵌入式系统开发的...

    deeplearning4j examples

    需要学习dl4j,无从下手,就想着先看看官网的examples,于是,下载了examples程序,结果无法运行,总是出错,如下: 查看一周的错误,也没有成功,马上就要放弃了,结果今天在论坛一大牛指导下,终于成功跑起,下面...

    [ASP.NET MVC] ASP.NET MVC 4 高级编程 (英文版)

    An outstanding author team presents the ultimate Wrox guide to ASP.NET MVC 4 Microsoft insiders join giants of the software development community to offer this in-depth guide to ASP.NET MVC, an ...

    FineUIMvc_v1.1.0_全部资料

    7. **在线示例源代码**:《在线示例源代码》FineUIMvc_Examples_v1.1.0.zip提供了实际运行的示例,通过查看和学习这些代码,开发者可以直观地了解FineUIMvc在实际项目中的应用方式,有助于提升开发效率。 综上所述...

    SpringMVC-demo - examples

    **SpringMVC 框架详解** `SpringMVC` 是 `Spring` 框架的一个模块,专门用于处理Web应用程序的请求-响应模型。...通过学习和实践这些示例,开发者可以更好地掌握 `SpringMVC` 的使用技巧,提升 Web 开发能力。

    ServletExamples JspExamples

    ServletExamples和JspExamples这两个项目名暗示了我们即将探讨的是Java服务器端编程的重要技术——Servlet和JSP(JavaServer Pages)的应用实例。Servlet是Java语言用于扩展Web服务器功能的接口,而JSP则是用于创建...

    qt4-book-examples.rar

    4. **图形视图框架**:QT4引入了图形视图框架,用于处理复杂的图形和视图操作。QGraphicsView和QGraphicsScene可以用来创建动态、可缩放的图形界面,例如动画效果和复杂的布局。 5. **事件处理**:QT4中的事件驱动...

    传文件,感谢UC dl4j-examples-master.zip

    DL4J是一个开源的Java库,允许开发人员在Java和Scala中构建和部署深度学习模型。"dl4j-examples-master.zip" 暗示这是从GitHub或其他代码托管平台下载的项目源码的主分支版本,通常包含了一系列示例代码和项目结构。...

    ext.net mvc

    **标题与描述解析** ...综上所述,这个压缩包提供了使用Ext.NET 2.4框架构建ASP.NET MVC应用所需的关键资源,包括配置示例、版本更新信息、许可协议和开发指南,是开发者学习和应用该框架的重要参考资料。

Global site tag (gtag.js) - Google Analytics