ASP.NET MVC Framework体验(2):显示列表数据

概述

ASP.NET WebForm下,显示列表数据,经常会使用服务器控件GridView、DataList等。在ASP.NET MVC Framework中,我们有两种方式进行显示数据,一是使用行内代码,即通过循环视图数据使用<%=%>标记进行呈现;二是使用服务器控件,同样可以把视图数据绑定在服务器控件,如ASP.NET 3.5中的新控件ListView。

准备数据访问

这里我们显示一个Post的列表DataContext和实体定义如下:

[Database(Name="Blog")]
public class BlogDataContext : DataContext
{
    public BlogDataContext()
        : base(@"Server=.\Sql2005;User Id=sa;Password=;Database=Blog")
    { 
        
    }

    public Table<Post> Posts
    {
        get
        {
            return this.GetTable<Post>();
        }
    }
}
Post实体:
[Table(Name="Posts")]
public class Post
{
    [Column(IsPrimaryKey=true,IsDbGenerated = true)]
    public int Id
    {
        get; set;
    }

    [Column]
    public string Title
    {
        get; set;
    }

    [Column]
    public string Author
    {
        get; set;
    }

    [Column]
    public DateTime PubDate
    {
        get; set;
    }

    [Column]
    public string Description
    {
        get; set;
    }
}

同时,我们定义一个BlogRepository类,用于读取Post数据,这样可以使得Controller中代码更加优雅,不再涉及数据访问:

public class BlogRepository
{
    public List<Post> GetAll()
    {
        BlogDataContext db = new BlogDataContext();

        IEnumerable<Post> posts = from p in db.Posts
                    orderby p.PubDate
                    select p;

        return posts.ToList<Post>();
    }
}

定义Controller

这里的Controller定义就非常简单了,获取所有Post数据,然后把数据传给视图

public class BlogController : Controller
{
    [ControllerAction]
    public void Index()
    {
        // 获取所有post数据
        BlogRepository repository = new BlogRepository();

        List<Post> posts = repository.GetAll();

        // 转向视图Index,显示Post列表
        RenderView("Index", posts);
    }
}

定义View

添加一个Index视图,并使其继承于ViewPage<List<Post>>。

1.使用行内代码显示,进行数据的循环并使用ViewPage提供的HtmlHelper方法。

<h3>1.使用行内代码</h3>
    <%=Html.ActionLink("Home", new { action="Index"})%> |
    <div>
        <%foreach (Post post in ViewData)
          { %>
        <div class="postitem">
            <strong>Title</strong><%=Html.Encode(post.Title) %></br>
            <strong>Author</strong><%=Html.Encode(post.Author) %></br>
            <strong>PubDate</strong><%=Html.Encode(post.PubDate.ToShortDateString()) %></br>
            <strong>Content</strong><%=Html.Encode(post.Description) %></br>
        </div><br />
        <% } %>
    </div>

在HTML代码中编写时VS2008同样提供了很好的智能提示功能:

TerryLee_MVC_004 

2.使用服务器控件ListView,编写代码如下:

<h3>使用ListView控件</h3>
    <asp:ListView ID="ListView1" runat="server">
        <LayoutTemplate>
              <div>
                     <asp:PlaceHolder ID="itemPlaceHolder" Runat="server"/>
             </div>
        </LayoutTemplate>

        <ItemTemplate>
            <div class="postitem">
            <strong>Title</strong><%# Eval("Title") %></</br>
            <strong>Author</strong><%# Eval("Author")%></br>
            <strong>PubDate</strong><%# Eval("PubDate")%></br>
            <strong>Content</strong><%# Eval("Description") %></br>
        </div><br />
        </ItemTemplate>
    </asp:ListView>

在后台代码中进行ListView的数据绑定,这里仅仅是对把视图数据绑定到了ListView上面,从数据库中获取数据交给Controller去做。

public partial class Views_Blog_Index : ViewPage<List<Post>>
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.ListView1.DataSource = ViewData;
        this.ListView1.DataBind();
    }
}

设置路径选择

同样我们需要进行路径选择的设置

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup
    RouteTable.Routes.Add(
                new Route
                {
                    Url = "[controller]/[action].mvc",
                    Defaults = new { action = "Index" },
                    RouteHandler = typeof(MvcRouteHandler)
                });
}

完成后,运行可以看到,使用行内代码和ListView控件的效果是一样的

TerryLee_MVC_005

TerryLee_MVC_006

结束语

在文章结束时,顺便说一下,好多朋友都问为什么有了WebForm,还要再出一个ASP.NET MVC Framework,对于这个问题,建议大家阅读一下这篇文章What's Ailing ASP.NET Web Forms

示例代码下载:/Files/Terrylee/MVCDemo02.rar

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-12-11 22:58 TerryLee 阅读(6580) 评论(57)  编辑 收藏 网摘 所属分类: [08]  Web开发

  回复  引用    
#1楼 2007-12-11 23:14 | [心有灵犀] [未注册用户]
沙发?
  回复  引用    
#2楼 2007-12-11 23:15 | [心有灵犀] [未注册用户]
第一个学习:)
  回复  引用  查看    
#3楼 [楼主]2007-12-11 23:23 | TerryLee      
@[心有灵犀]
呵呵,我也是刚开始看了一点:)
  回复  引用  查看    
#4楼 2007-12-11 23:27 | stonezhu      
@TerryLee
效率很高嘛,早晨发了晚上又发啦,强烈支持
  回复  引用  查看    
#5楼 [楼主]2007-12-11 23:42 | TerryLee      
@stonezhu
唉,最近事情很多,还要忙SmartCode的开发,所以时间也不多。。。
  回复  引用  查看    
#6楼 2007-12-11 23:42 | 任佶      
怀念那个什么都很简单的asp年代
  回复  引用  查看    
#7楼 [楼主]2007-12-11 23:44 | TerryLee      
@任佶
不过在MVC下,类似于asp的开发应该更加严格和OO了
  回复  引用  查看    
#8楼 2007-12-11 23:58 | stonezhu      
搞得现在也像在写JSP
  回复  引用  查看    
#9楼 2007-12-12 00:02 | 任佶      
前些天看了Hanselman录的MVC视频,感叹之余觉得现在Web的开发让人越来越云里雾里的。大部分的时间里不知道他在干吗,再加上linq, extension方法,感觉这还是那个我们每天都在用的.net吗。
  回复  引用  查看    
#10楼 [楼主]2007-12-12 00:29 | TerryLee      
@stonezhu
:)
  回复  引用  查看    
#11楼 [楼主]2007-12-12 00:29 | TerryLee      
@任佶
现在让1.1那个时代的程序员看3.0的代码,未必看得懂啊:)
  回复  引用  查看    
#12楼 2007-12-12 00:44 | Clingingboy      
仿佛回到了asp
  回复  引用    
#13楼 2007-12-12 01:00 | 飞雪尔 [未注册用户]
已经开始在迁移我自己的网站到mvc下面了。不过碰到一个问题。
<a href="<%= Url.Action("list") %>">Show all items</a>
类似这样的link在Scott的blog中是说有智能提示的,但是在我的2008里面,只要是<%=%>外面有单引号或者双引号,智能提示就完全不起作用,而且连黄色的tooltip都没有。
另外一个问题,按照scott的文章,可以在aspx文件中放置literal控件,再在cs文件的
public void Page_Load()
{

}
中写,不过我发现在pageload里面,控件id没办法智能提示,就算手写,调试的时候也会报错说找不到此控件。
不知道lz遇到这个问题没有?
  回复  引用  查看    
#14楼 [楼主]2007-12-12 08:35 | TerryLee      
@Clingingboy
嗯,有一点像:)
  回复  引用    
#15楼 2007-12-12 08:36 | Eeyore [未注册用户]
好贴只能顶~~,期待SmartCode,:)
  回复  引用  查看    
#16楼 [楼主]2007-12-12 08:37 | TerryLee      
@飞雪尔
1.关于智能提示,我这儿也有这个问题,我用的是Express版本的

2.放置Literal控件之后,我这儿没出现你所说的问题,仍然可以提示

// 这么早就迁移会不会太快了啊?

  回复  引用  查看    
#17楼 [楼主]2007-12-12 08:37 | TerryLee      
@Eeyore
谢谢啊:)
  回复  引用  查看    
#18楼 2007-12-12 08:38 | henry      
不知道在aspx文件下写代码感知如何,VS2008BETA2还不如VS2005,不知道VS2008RTM怎样.
好快啊,老兄精神可嘉阿
  回复  引用  查看    
#20楼 [楼主]2007-12-12 08:42 | TerryLee      
@henry
在VS2008下,ASPX中如果不出现在双引号中的话,智能提示是没有问题的,不过RTM我没试,我用的是Express版:)
  回复  引用  查看    
#21楼 [楼主]2007-12-12 08:44 | TerryLee      
@自由、创新、研究、探索……
呵呵,也是想尽快写出来跟大家交流一下:)
  回复  引用  查看    
#22楼 2007-12-12 08:50 | henry      
@TerryLee
文件少还可以一旦文件多就有种想杀人的感觉,我期待这功能的强化快半年了.
希望到正式版在aspx下写代码感知能达到和写代码几乎一样...

看来ASP.NET MVC的aspx这个实现和NClay有点类似.

  回复  引用  查看    
#23楼 2007-12-12 09:00 | Neo0820      
天下之大和久必分;分久必合。Microsoft还是回到当初曾不屑类似于ASP的开发模式。就像大家争论的是胖客户端好还是瘦客户端好。某个层面的技术没有绝对的优势,在某段时间某个阶段能方便的解决问题就是好东西
  回复  引用  查看    
#24楼 [楼主]2007-12-12 09:26 | TerryLee      
@henry
嗯,正式版的时候应该会有很大的改进吧。另外,ASP.NET MVC目前只实现了一些基本的功能,并没有什么新意,好多HtmlHelper方法还在MVCToolkit中提供,希望后面可以加强一些功能。
  回复  引用  查看    
#25楼 [楼主]2007-12-12 09:28 | TerryLee      
@Neo0820
只能说是有点像asp的开发模式,这种开发比起asp来说,更加严格了,只是代码风格有些像:)
  回复  引用    
#26楼 2007-12-12 09:36 | 建议楼主 [未注册用户]
建议楼主把What's Ailing ASP.NET Web Forms这篇文挡翻译过来。我等的E文太差。让我们也能看看这篇文挡
  回复  引用  查看    
#27楼 2007-12-12 09:41 | 第一控制.NET      
@TerryLee
他说下一个预览MVCToolkit里的玩意就会编译到mvc里去了。
  回复  引用  查看    
#28楼 2007-12-12 10:18 | lovecherry      
楼主这种分享的精神是非常好的,不过我想提醒一下各位看官,微软的东西千万别在release前用到项目中去。还有我想说,微软提供了很多新技术,但是不等于是要你去用这些。很多人在微软没有提供方案之前不闻不问开源社区的项目,等微软也推出了所谓官方的XX之后就迫不及待要用,这种想法很可怕哦,新技术做做demo还可以,要用到项目中去就要考虑很多了。说到ASP.NET的开发多元化,说不定过段时间就会出现《ASP.NET指南基于MVC》和《ASP.NET指南基于WEBFORM》。。。随着3.5的到来,看来.NET中也会发生隔行如隔山事情?一个活在.NET1.1的人还能看懂.NET 3.5的代码吗???哈哈哈哈
  回复  引用  查看    
#29楼 2007-12-12 10:28 | 暗香浮动      
太牛了。
写这么一篇大概要花费多长时间呢。
  回复  引用  查看    
#30楼 2007-12-12 11:10 | 第一控制.NET      
@lovecherry
俺正准备在一个小项目里用这个玩意。
  回复  引用    
#31楼 2007-12-12 11:28 | 飞雪尔 [未注册用户]
@TerryLee
我用的是ts版本,确实是有问题,引号中间的没办法智能提示,这个我已经给soctt留言了,等回复了。
关于code behind的问题,我这边还是有问题,不知道怎么回事。
另外我发现一个大问题,就是当master page本身需要传递viewdata来显示数据的时候,按照scott的意见弄一个masterviewdata,其他viewdata继承自它,但是我这样操作了。
出现这种错误
A ViewMasterPage<TViewData> can only be used with content pages that derive from ViewPage<TViewData>.

PS:我是在我自己业务做的实验项目上迁移的。
  回复  引用    
#32楼 2007-12-12 11:32 | GerryLiang [未注册用户]
to: lovecherry
你说的很对,这些所谓的MVC在开源社区很早就有人用了。楼主研究过Castle就知道,他们有什么相似之处。还有,不是所有新技术都要追捧,对于一个程序员,我们必须清楚地知道什么东西对于我们来说有最大的学习价值。就拿这个MVC FrameWorK来说,真正懂得MVC架构模式的人可以直接上手,但对于只漂浮于新技术应用层面的开发人员来说,却不得不花很多的时间去学习如何使用它!
  回复  引用  查看    
#33楼 2007-12-12 11:37 | 人非木      
已经出来了?现在大家用不用mono呢?

  回复  引用    
#34楼 2007-12-12 11:41 | HarryLu [未注册用户]
请问楼主
如果要在这个基础上加一个翻页空间应该怎么做呢?

  回复  引用  查看    
#35楼 2007-12-12 12:15 | stonezhu      
先研究着,不知道什么时候能真正用上去开发呢,3.5不知道什么时候能普及
  回复  引用  查看    
#36楼 2007-12-12 12:43 | 双鱼座      
万能的主啊!怎么打着MVC的旗号又回到了ASP的时代?
  回复  引用  查看    
#37楼 2007-12-12 13:39 | henry      
@双鱼座
其实有点类似于当年的asp+com方式,不过那时候似乎很少人把业务封装成com(调试和部署都比较麻烦).
这种分离方式对UI的调整的确是很方便,特别对于完全不懂asp.net的美工来说可以完全自己完成套页,对于webfrom的服务控件来说就没这么简单.
在编写复杂的效果表现的界面,要封装成服务器控件对很多人来说并不是简单的事情.

  回复  引用  查看    
#38楼 2007-12-12 15:08 | 丹心猪(Dansinge)      
mark
  回复  引用    
#39楼 2007-12-12 16:15 | 飞雪尔 [未注册用户]
根据和Scott Gu的确认,我发现的三个问题确实都是bug,MS正在修复。

1. web project类型的项目中,在code behind文件没办法智能提示的,需要先把这个文件Convert to Web Application,增加了.designer.cs文件后才能智能提示。
2. 当<%%>代码段在aspx页面的引号中时,没有办法智能提示。
3. 当为site.master page传递MasterViewData是,报A ViewMasterPage<TViewData> can only be used with content pages that derive from ViewPage<TViewData>.的错误。

  回复  引用  查看    
#40楼 [楼主]2007-12-12 21:32 | TerryLee      
@建议楼主
http://www.infoq.com/cn上已经有中文的了,建议你去看一下:)

http://www.infoq.com/cn/news/2007/12/MVC-vs-Web-Forms
  回复  引用  查看    
#41楼 [楼主]2007-12-12 21:33 | TerryLee      
@第一控制.NET
是的,暂时以Toolkit的形式提供,要用到的时候需要引用MVCToolkit程序集
  回复  引用  查看    
#42楼 [楼主]2007-12-12 21:35 | TerryLee      
@飞雪尔
看来确实是有问题了

//我以为你已经在正式项目中使用了,吓一大跳。自从上次atlas事件之后,没有Release的东西我一般不敢用:)
  回复  引用  查看    
#43楼 [楼主]2007-12-12 21:36 | TerryLee      
@lovecherry
确实是,现在也只是作为研究性的东西,看一下,真正在项目中我还是不敢使用。一个对于1.1非常精通的人来看3.5的代码,估计看不懂了,呵呵:)
  回复  引用  查看    
#44楼 [楼主]2007-12-12 21:37 | TerryLee      
@暗香浮动
呵呵,这篇不是很长啊,加上写代码和文档1-2小时吧
  回复  引用  查看    
#45楼 [楼主]2007-12-12 21:38 | TerryLee      
@第一控制.NET
现在就用,恐怕。。。,就怕再次出现像去年的atlas事情:)
  回复  引用  查看    
#46楼 [楼主]2007-12-12 21:39 | TerryLee      
@人非木
现在没用,mono将何去何从,暂时还不得知,据负责人介绍说,要看ASP.NET MVC Framework所提供的功能来决定是否要继续开发下去。
  回复  引用  查看    
#47楼 [楼主]2007-12-12 21:40 | TerryLee      
@HarryLu
翻页控件,最简单的办法就是使用asp下的那种手工输出的方式,肯定行,呵呵
估计也可以使用3.5中的翻页控件吧,我还没看
  回复  引用  查看    
#48楼 [楼主]2007-12-12 21:41 | TerryLee      
@stonezhu
先研究着再看吧:)
  回复  引用  查看    
#49楼 [楼主]2007-12-12 21:41 | TerryLee      
@双鱼座
确实是,代码的风格越来越像asp了。下一篇表单提交中我觉的更像是asp了,呵呵
  回复  引用  查看    
#50楼 2007-12-12 22:26 | 坐断东南 笑煞之!!      
唉。。又来晚了。。
还真的没有在这里坐过沙发。。

说实话。MS 的东西用起来真可怕。。发展过快了。。
未定型的技术。
难免在项目中出错。。出错了。。网上资料少。。就真是叫天不应,叫地不灵啊。。


新技术。等成熟后再用吧。。唉。。
不过。。学着玩玩,也不可以,是么?
  回复  引用  查看    
#51楼 [楼主]2007-12-12 23:15 | TerryLee      
@坐断东南 笑煞之!!
先研究之,在项目中使用,就再等等吧:)
  回复  引用    
#52楼 2007-12-13 18:27 | David Fa [未注册用户]
--引用--------------------------------------------------
TerryLee: @任佶
现在让1.1那个时代的程序员看3.0的代码,未必看得懂啊:)
--------------------------------------------------------
说实在的,现在看的确实很迷茫。有点云里雾里~~
  回复  引用  查看    
#53楼 [楼主]2007-12-13 19:50 | TerryLee      
@David Fa
呵呵:)
  回复  引用    
#54楼 2007-12-19 17:04 | 譚 [未注册用户]
瀏覽視圖頁面時,總是報
"並未將物件參考設定為物件的執行個體 "這是怎麼回事?
請大家幫忙!
  回复  引用    
#55楼 2007-12-25 17:59 | Luc9i [未注册用户]
你好,terry,我想请问一下,如果我的一个view页面用的是ViewContentPage,假设此页面名字为index.aspx,我在其中放置了一个ListView控件,代码如下:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="MvcApplication.Views.Categories.index" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
<form id="form1" runat="server">
<asp:ListView ID="ListView1" runat="server">
<LayoutTemplate>
<div>
<asp:PlaceHolder ID="itemPlaceHolder" Runat="server"/>
</div>
</LayoutTemplate>

<ItemTemplate>
<div class="postitem">
<strong>ID</strong>:<%# Eval("CategoryId") %><br></br>
<strong>Name</strong>:<%# Eval("Name")%><br></br>
<strong>Description</strong>:<%# Eval("Descn")%><br></br>
</div><br />
</ItemTemplate>
</asp:ListView>
</form>
</asp:Content>
按照您的例子,需要在index.aspx.cs的Page_Load方法中对控件进行数据绑定,但是我在Page_Load中输入this.的时候找不到ListView1这个控件,请问如何解决这个问题,btw,我试图在master page中找,但是不得要领,烦劳帮我看看,谢谢了。
  回复  引用  查看    
#56楼 [楼主]2007-12-26 21:56 | TerryLee      
@Luc9i
目前的MVC的一个Bug,在.cs中找不到服务器控件
  回复  引用  查看    
#57楼 2008-05-14 21:55 | 镜涛      
mark

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-10-28 12:49 编辑过
Google站内搜索




相关链接: