http://www.cnblogs.com/iamlilinfeng/p/4075292.html

目录

一、Contrl与View数据传递(多表数据)

二、分页控件介绍

三、MVC源码说明

四、源码下载

五、mvc入门教程目录

一、Contrl与View数据传递(多表数据)

园子也是用mvc来写的,我们用园子的首页举个例子。

上图我只切了园子首页的一部分,如图所示,共分为4块内容。而这4块内容可能来自于不同的数据表,假设:第一、二块内容来自Blog表、第三、四块内容来自AD表。此时MVC一般有两种方式进行Control与View的交互。

1)ViewBag变量方式

使用4个ViewBag变量进行数据传递,Data1、Data2、Data3、Data4的数据直接从数据库里调。

Control中伪代码如下所示:

1         public ActionResult CnBlogIndex()
2 {
3 ViewBag.Data1 = Data1;
4 ViewBag.Data2 = Data2;
5 ViewBag.Data3 = Data3;
6 ViewBag.Data4 = Data4;
7 return View();
8 }

View中伪代码如下所示:

 1 //第一块内容
2 @foreach (Data1 data in (ViewBag.Data1 as IEnumerable<Data1>))
3 {
4 <tr>
5 <td>@Html.DisplayFor(model => data.ID)</td>
6 </tr>
7 }
8 //第二块内容
9 @foreach (Data2 dat1 in (ViewBag.Data2 as IEnumerable<Data2>))
10 {
11 <tr>
12 <td>@Html.DisplayFor(model => data.ID)</td>
13 </tr>
14 }
15 //第三块内容
16 @foreach (Data3 data in (ViewBag.Data3 as IEnumerable<Data3>))
17 {
18 <tr>
19 <td>@Html.DisplayFor(model => data.ID)</td>
20 </tr>
21 }
22 //第四块内容
23 @foreach (Data4 data in (ViewBag.Data4 as IEnumerable<Data4>))
24 {
25 <tr>
26 <td>@Html.DisplayFor(model => data.ID)</td>
27 </tr>
28 }

2)ViewModel方式(推荐)

什么是ViewModel?ViewModel就是针对视图做的Model,让Model更加适合于View。Data1、Data2、Data3、Data4的数据直接从数据库里取出,然后组装给ViewModel,ViewModel做为整个页面的数据载体进行数据传递:

ViewModel中的伪代码如下所示:

1     public class CnBlogIndex {
2 List<Data> Data1 { get; set; }
3 List<Data> Data2 { get; set; }
4 List<Data> Data3 { get; set; }
5 List<Data> Data4 { get; set; }
6 }

Control中伪代码如下所示:

         public ActionResult CnBlogIndex()
{
ViewModel.CnBlogIndex CnBlogIndex = new ViewModel.CnBlogIndex();
CnBlogIndex.Data1 = Data1;
CnBlogIndex.Data2 = Data2;
CnBlogIndex.Data3 = Data3;
CnBlogIndex.Data4 = Data4;
return View(CnBlogIndex);
}

View中伪代码如下所示:

 1 @model CnBlogIndex
2 @foreach (var info in Model.Data1)
3 {
4 <tr>
5 <td>info.**</td>
6 </tr>
7 }
8 @foreach (var info in Model.Data2)
9 {
10 <tr>
11 <td>info.**</td>
12 </tr>
13 }
14 @foreach (var info in Model.Data3)
15 {
16 <tr>
17 <td>info.**</td>
18 </tr>
19 }
20 @foreach (var info in Model.Data4)
21 {
22 <tr>
23 <td>info.**</td>
24 </tr>
25 }

两种传递数据的方式都可以完成我们的正常工作,但个人更推荐使用ViewModel将一个页面的信息进行聚合,这样虽然多了一些工作量,但可以使整体结构更清晰,同进也更易于维护。

二、分页控件介绍

很多朋友在刚接触mvc的时候都喜欢自己写分页,此处推荐使用开源分页控件“MvcPager”,相信大家在使用webform的时候大多使用的分页控件都是aspnetpager(Webdiyer出品),这个mvc分页控件也是Webdiyer出品(很好很强大),官方博客:http://www.webdiyer.com/,我在前面的教程中也提到过这个分页控件,但群友们反应我前面的教程分页控件带有查询条件时,翻页后条件消失。因此,在些我对分页控件再次进行讲解,并加上查询条件。

效果如下图所示:

查询条件使用文本框,并且使用参数的形式在view与control中进行传输。这里只是使用了mvcpager的一种方式(get查询方式),mvcpager有各种分页的方式,如ajax分页等。有兴趣的可以下载代码研究下,官方地址如下:http://www.webdiyer.com/mvcpager/

ViewModel中的代码如下:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Web;
5 using Webdiyer.WebControls.Mvc;
6
7 namespace MvcApplication.Models.Home
8 {
9 public class Index
10 {
11 public string BlogURL { get; set; }
12 //当前用户
13 public Model.User User { get; set; }
14 //信息列表
15 public PagedList<Model.Info> Infos { get; set; }
16 }
17 }

Control中的代码如下:

 1         public ActionResult Index(int? id = 1, string title = null)
2 {
3 //用户
4 Model.User User = new Model.User();
5 User.UserID = 1;
6 User.UserName = "mvc技术交流(群号:384185065)";
7 //信息列表(此处使用分页控件提出数据)
8 int totalCount = 0;
9 int pageIndex = id ?? 1;
10 int pageSize = 2;
11 PagedList<Model.Info> InfoPager = DAL.Info.GetInfos(title, pageSize, (pageIndex - 1) * 2, out totalCount).AsQueryable().ToPagedList(pageIndex, pageSize);
12 InfoPager.TotalItemCount = totalCount;
13 InfoPager.CurrentPageIndex = (int)(id ?? 1);
14 //数据组装到viewModel
15 Models.Home.Index index = new Models.Home.Index();
16 index.BlogURL = "http://www.cnblogs.com/iamlilinfeng/archive/2013/04/01/2992432.html";
17 index.User = User;
18 index.Infos = InfoPager;
19 //------------------使用ViewBig变量传递数据---------------//
20 //ViewBag.PagerData = InfoPager;
21 return View(index);
22 }

View中的代码如下:

 1 @model MvcApplication.Models.Home.Index
2 @using Webdiyer.WebControls.Mvc;
3 <title>MVC入门教程</title>
4
5 @*----------------------------------ViewModel中的博客地址,mvc入门教程博客地址:http://www.cnblogs.com/iamlilinfeng/archive/2013/04/01/2992432.html-----------------------*@
6 @Html.Label("博客地址:") @Model.BlogURL
7 <br />
8 @Html.Raw("--------------------------------------------------------------------------------------------------------------------------------------------------------------------")
9 <br />
10
11 @*----------------------------------ViewModel用户实体信息-----------------------*@
12 @Html.LabelFor(model => model.User.UserID) @Html.Raw(":") @Model.User.UserID
13 <br />
14 @Html.LabelFor(model => model.User.UserName) @Html.Raw(":") @Model.User.UserName
15 <br />
16
17 @*----------------------------------ViewModel数据信息分页-----------------------*@
18 @Html.Raw("--------------------------------------------------------------------------------------------------------------------------------------------------------------------")
19 <br />
20 @using (Html.BeginForm("Index", "Home", new RouteValueDictionary { { "id", "" } }, FormMethod.Get))
21 {
22 @Html.Label("查询条件(标题):") <input name="title" value="@Request.QueryString["title"]" /><input type="submit" value="查询" />
23 }
24 <table>
25 <tr>
26 <th>编号</th>
27 <th>标题</th>
28 <th>内容</th>
29 </tr>
30 @foreach (var info in Model.Infos)
31 {
32 <tr>
33 <td>@Html.DisplayFor(model => info.InfoID)</td>
34 <td>@Html.DisplayFor(model => info.Title)</td>
35 <td>@Html.DisplayFor(model => info.Content)</td>
36 </tr>
37 }
38 @*----------------------------------使用ViewBig变量传递数据-----------------------*@
39 @*@foreach (Model.Info info in (ViewBag.PagerData as IEnumerable<Model.Info>))
40 {
41 <tr>
42 <td>@Html.DisplayFor(model => info.InfoID)</td>
43 <td>@Html.DisplayFor(model => info.Title)</td>
44 <td>@Html.DisplayFor(model => info.Content)</td>
45 </tr>
46 }*@
47 </table>
48 @Html.Pager(Model.Infos, new PagerOptions
49 {
50 PageIndexParameterName = "id",
51 ShowPageIndexBox = true,
52 FirstPageText = "首页",
53 PrevPageText = "上一页",
54 NextPageText = "下一页",
55 LastPageText = "末页",
56 PageIndexBoxType = PageIndexBoxType.TextBox,
57 PageIndexBoxWrapperFormatString = "请输入页数{0}",
58 GoButtonText = "转到"
59 })
60 @Html.Raw("共:") @Model.Infos.TotalItemCount @Html.Raw("页,")
61 @Model.Infos.CurrentPageIndex @Html.Raw("/") @Model.Infos.TotalPageCount @Html.Raw("页")

三、MVC源码说明

开发环境:vs2013,mvc4。解决方案共分为3个项目。MvcApplication为mvc展示层,Model为数据实体与数据库一一对应,DAL链接数据进行数据的存取。

1,MvcApplication--Models--Index,为针对View中的Index的ViewModel,用于组装Index所需要的所有数据

2,Model--Info,为信息实体,对应信息表。用于讲解分页数据

3,DAL--Sqlcommon,调用分页存储过程的类。

View中展示的数据是由:User、List<Info>共同来提供的,有了这个示例后,再多的数据都可以通过该方式进行组装。

四、源码下载

点击我下载源码

五、mvc入门教程目录

0.无废话MVC入门教程目录页

1.无废话MVC入门教程一[概述、环境安装、创建项目]

2.无废话MVC入门教程二[第一个小Demo]

3.无废话MVC入门教程三[路由设置及视图入门]

4.无废话MVC入门教程四[视图中的Layout使用]

5.无废话MVC入门教程五[Control与View交互]

6.无废话MVC入门教程六[Model中的验证规则]

7.无废话MVC入门教程七[Control中使用AOP]

8.无废话MVC入门教程八[MvcPager分页控件的使用]

9.无废话MVC入门教程九[实战一:用户注册与登陆]

10.无废话MVC入门教程十[实战二:用户管理]

版权:http://www.cnblogs.com/iamlilinfeng

MVC分页的更多相关文章

  1. ASP.NET MVC分页组件MvcPager 2.0版发布暨网站全新改版

    MvcPager分页控件是在ASP.NET MVC Web应用程序中实现分页功能的一系列扩展方法,该分页控件的最初的实现方法借鉴了网上流行的部分源代码, 尤其是ScottGu的PagedList< ...

  2. ASP.NET MVC 4使用PagedList.Mvc分页

    ASP.NET MVC中进行分页的方式有多种,在NuGet上有提供使用PagedList.PagedList.Mvc进行分页. 1. 通过NuGet引用PagedList.Mvc 在安装引用Paged ...

  3. ASP.NET MVC分页实现之改进版-增加同一个视图可设置多个分页

    我之前就已经实现了ASP.NET MVC分页(查看该博文),但它有局限性,必须确保在同一个视图中只能有一处分页,若需要在同一个视图中设置多个分页,却无能为力,为此,我重新对原先的代码进行了优化,增加了 ...

  4. Mvc 分页栏扩展方法

    using System; using System.Collections.Generic; using System.Reflection; using System.Text; using Sy ...

  5. 转:MVC分页

    原文地址:http://www.cnblogs.com/iamlilinfeng/p/4075292.html 分页总是搞得我很烦,也是因为刚接触,貌似有好多插件,之前在用一个,可是后来发现一翻页原来 ...

  6. spring mvc 分页

    spring mvc 分页

  7. 基于Bootstrap的Asp.net Mvc 分页

    基于Bootstrap的Asp.net Mvc 分页的实现 最近写了一个mvc 的 分页,样式是基于 bootstrap 的 ,提供查询条件,不过可以自己写样式根据个人的喜好,以此分享一下.首先新建一 ...

  8. Mvc分页组件MvcSimplePager代码重构

    1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...

  9. Mvc分页组件MvcSimplePager代码重构及使用

    1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...

随机推荐

  1. SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据

    这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...

  2. Arcmap中加载互联网地图资源

    本文转载自:http://blog.3snews.net/space.php?uid=6955280&do=blog&id=67981 前一段时间想在Arcmap中打开互联网地图中的地 ...

  3. android okvolley框架搭建

    最近新出了很多好东西都没时间去好好看看,现在得好好复习下了,记下笔记 记得以前用的框架是android-async-http,volley啊,或者其它的,然后后面接着又出了okhttp,retrofi ...

  4. UITableView cell复用出错问题 页面滑动卡顿问题 & 各杂七杂八问题

    UITableView 的cell 复用机制节省了内存,但是有时对于多变的自定义cell,重用时会出现界面出错(例如复用出错,出现cell混乱重影).滑动卡顿等问题,这里只简单敲下几点复用出错时的解决 ...

  5. jquery ajax异步和同步从后天取值

    最近使用jquery的ajax,发现有些效果不对,ajax请求后返回的json串回来了,但是执行顺序有问题. var isReload = false; $.post('/home/DetectCac ...

  6. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  7. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  8. java.lang.String.getBytes(String charsetName)方法实例

    java.lang.String.getBytes(String charsetName) 方法编码将此String使用指定的字符集的字节序列,并将结果存储到一个新的字节数组. 声明 以下是java. ...

  9. 又见SpringMVC

    一.如何让一个普通类成为Controller? 方案一:实现接口Controller解析:handleRequest(request,response) 方案二:继承AbstractControlle ...

  10. ajax的循环

    一.业务需求 在开发中,当一个列表页面加载完成后,我需要根据列表每一项的id去服务器端获取对应的数据然后再把获取的数据赋给当前id对应的标签. 例如如下表格: 我有一系列的商品编号,我需要根据商品编号 ...