一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10


一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10
 
本文根据《Professional ASP.NET MVC 1.0》中微软牛人Scott Guthrie 提供免费下载的第一章,一步一步演示如何通过ASP.NET MVC 1.0 正式版创建NerdDinner 范例程序。对了解如何使用最新的ASP.NET MVC 1.0框架创建Web Application 非常有帮助。本文由http://forum.entlib.com 开源论坛小组提供。关于本文的一些资源,请参考文章最后的链接。
 
前面系列文章:
 
本文继续学习之旅,一步一步通过ASP.NET MVC 1.0 实现NerdDinner 范例程序。
 
实现Index视图模板
现在我们开始实行Index视图模板 – 生成即将来临的宴会Dinners列表。首先,将光标定位在Index action方法(当然是在DinnersController类中),接着右键点击,选择弹出菜单中的Add View菜单项。
在弹出Add View对话框中,视图模板的名称为Index,选择Create a strongly-typed View 复选框。这里,我们选择NerdDinner.Models.Dinner 为模型类型,View Content 列表框选择List,用来生成初始的列表脚本。
 

 
点击Add按钮,Visual Studio 自动在\Views\Dinners目录创建新的Index.aspx 视图模板,且自动实现一个初始的实现,将传入到视图的数据以HTML表格的形式呈现。当我们运行范例程序时,访问/Dinners/地址,将看到如下的效果:
 

 
上面的表格显示即将来临的宴会Dinners列表,但是不是我们想要的格式。我们可以更新Index.aspx 视图模板,展示较少的列,并使用<ul> 元素来呈现列表,而不是使用表格。示例代码如下:
<asp:Content ID="Title" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
 
<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        Upcoming Dinners</h2>
    <ul>
        <% foreach (var dinner in Model)
           { %>
        <li>
            <%= Html.Encode(dinner.Title) %>
            on
            <%= Html.Encode(dinner.EventDate.ToShortDateString())%>
            @
            <%= Html.Encode(dinner.EventDate.ToShortTimeString())%>
        </li>
        <% } %>
    </ul>
</asp:Content>
 
上述代码使用var 关键字在foreach 循环语句中,循环Model中的每一个dinner对象。对C# 3.0不熟悉的人可能认为使用var 意味着dinner对象是late-bound,实际上这是编译器根据强类型Model (类型为IEnumerable<Dinner>)推断出dinner的类型,并编译本地变量dinner为Dinner类型,同时提供代码智能提示和编译期间的类型检查。
 

 
再次浏览器中访问/Dinners 地址时,发现视图已经更新了,显示效果如下:
 

 
现在看上去不错了,但还不够完美。最后一步是实现用户点击列表中每一条记录时,可以看到详细信息。通过使用HTML超链接指向DinnersController控制器的Details action方法,来实现这一点。
在Index视图中,有2种方法可以生成超链接。第一种方法是手动编写HTML的<a> 元素,<% %>代码块嵌在HTML <a>元素中,如下所示:
        <% foreach (var dinner in Model)
           { %>
        <li>
            <a href="/Dinners/Details/<%= dinner.DinnerID %>"><%= Html.Encode(dinner.Title) %></a>
            on
            <%= Html.Encode(dinner.EventDate.ToShortDateString())%>
            @
            <%= Html.Encode(dinner.EventDate.ToShortTimeString())%>
        </li>
        <% } %>
 
第二种方法是利用ASP.NET MVC内置的Html.ActionLink() 辅助方法,该方法支持通过编程的方式创建HTML <a>元素,链接控制器Controller的另一个action方法。
<%= Html.ActionLink(dinner.Title, "Details", new { id=dinner.DinnerID }) %>
 
Html.ActionLink() 辅助方法的第一个参数是链接文本(示例代码是dinner的主题),第二个参数是控制器的action方法名称(示例代码是Details方法),第三个参数是一组传入给action方法的参数(以匿名类型的名称/值对的方式来实现)。上述代码中,指定链接的dinner的id参数。因为ASP.NET MVC默认的URL路由规则是{Controller}/{Action}/{id},Html.ActionLink() 辅助方法将生成如下的输出:
<a href="/dinners/Details/2">EntLib.com 开源ASP.NET论坛</a>
 
在Index.aspx视图文件中,我们将使用 Html.ActionLink() 辅助方法,让列表中的每一条记录指向正确的details地址:
    <h2>
        Upcoming Dinners</h2>
    <ul>
        <% foreach (var dinner in Model)
           { %>
        <li>
            <%= Html.ActionLink(dinner.Title, "Details", new { id=dinner.DinnerID }) %>
            on
            <%= Html.Encode(dinner.EventDate.ToShortDateString())%>
            @
            <%= Html.Encode(dinner.EventDate.ToShortTimeString())%>
        </li>
        <% } %>
    </ul>
 
现在,我们再次访问/Dinners 网址,将看到如下的dinner list页面:
 

 
当我们点击dinners列表的任何一条记录,就可以进入dinner的详细页面:
 
今天就到这里了,明天继续翻译ASP.NET MVC eBook – 开发NerdDinner 范例程序向导。欢迎访问http://blog.EntLib.com 博客平台获取更多的MVC学习资料。
 
相关资源下载链接:
1. ASP.NET MVC 1.0 正式版发布了!!!
 
2. 免费ASP.NET MVC eBook 向导-电子书下载
 

 

发表 @ 2009年3月31日 22:25

打 印

评论

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by itbird at 2009/4/13 15:55
Gravatar
"Upcoming Dinners",这里是将来时态....
linq to sql:
return from dinner in db.Dinners where dinner.EventDate > DateTime.Now
数据表Dinners里的EventDate的时间设为1个月后,或者更久的时间.不然不会显示哦..

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by entlibforum at 2009/4/13 16:07
Gravatar
呵呵,不错!你补充的很好!

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by SQL at 2009/5/20 17:30
Gravatar
没有源代码吗?

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by entlibforum at 2009/5/20 17:51
Gravatar

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by wys at 2009/7/2 14:31
Gravatar
MVC确实很好恨强大!

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by abcsw12 at 2009/10/2 19:03
Gravatar
为什么我的做出来的Index页面只显于一条数据,其他的怎么就没有显于

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by aniucrazy at 2009/11/19 19:08
Gravatar
很好很强大

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by eaglet at 2009/12/20 13:11
Gravatar
前面的问题都解决了,我现在到Index页面的内容数据怎么不显示呢?

Details里的没问题,怪了

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by eaglet at 2009/12/20 13:42
Gravatar
原来数据表里的时间必须大于当前的时间

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by apcle at 2010/4/7 7:21
Gravatar
Details里面可以正常显示数据,Index.aspx里面的头为
<%@ Page Inherits="System.Web.Mvc.ViewPage<IEnumerable<NerdDinner.Models.Dinner>>" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" %>
这个不能将所有数据显示出来,但修改为
<%@ Page Inherits="System.Web.Mvc.ViewPage<NerdDinner.Helpers.PaginatedList<NerdDinner.Models.Dinner>>" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" %>
就会出错
The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[NerdDinner.Models.Dinner]' but this dictionary requires a model item of type 'NerdDinner.Helpers.PaginatedList`1[NerdDinner.Models.Dinner]'.
异常详细信息: System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[NerdDinner.Models.Dinner]' but this dictionary requires a model item of type 'NerdDinner.Helpers.PaginatedList`1[NerdDinner.Models.Dinner]'.

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 10

Left by lmy at 2010/6/9 11:42
Gravatar
关于Index页面显示:为什么数据库时间要大于当前时间才能显示呢?

您的评论:



 (不显示)


 
 
 
Please add 2 and 3 and type the answer here:
    
 

评论预览窗口:

 
«九月»
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789