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


一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 8
 
本文根据《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 范例程序。
 
在DinnersController控制器中使用DinnerRepository
现在我们开始先前创建的model替代现有的Index() 和 Details() action方法的实现。我们使用之前创建的DinnerRepository 类来实现这些方法。
首先,需要using NerdDinner.Models命名空间,然后定义一个DinnerRepository实例作为DinnerController类的成员变量。在本章的后面部分,我们将引入依赖注入(Dependency Injection)的概念,演示另外一种方法来获取DinnerRepository的引用,实现更好的单元测试,但是现在,我们仍旧使用DinnerRepository实例。代码如下所示:
    public class DinnersController : Controller
    {
        DinnerRepository dinnerRepository = new DinnerRepository();
        //
        // GET: /Dinners/
        public void Index()
        {
            var dinners = dinnerRepository.FindUpcomingDinners().ToList();
        }
        //
        // GET: /Dinners/Details/2
        public void Details(int id)
        {
            Dinner dinner = dinnerRepository.GetDinner(id);
        }
    }
 
现在,我们已经准备好使用数据模型对象来产生HTML响应了。
 
控制器Controller使用视图Views
尽管在action方法中可以写代码拼装HTML,通过Response.Write() 方法返回给客户端,但是这种方法并不可取。更好的办法是,在DinnersController的action方法中仅仅出来业务和数据逻辑,并将相关的数据传递给单独的视图(view)模板,view负责生成HTML展示。随后我们会看到,view模板就是一个简单的文本文件,通常包含HTML标识和嵌入的脚本。
 
将控制器controller逻辑和视图view展示分开带来很多好处,尤其是它帮助清晰隔离了应用程序代码和用户界面展示的脚本。这可以非常方便地对应用程序逻辑进行单元测试,而不需要UI展示逻辑,也可以方便修改UI脚本,而不会更改应用程序的代码,当然也有助于开发人员和用户界面设计人员在项目中的合作。
 
下面,我们更新DinnersController类,通过更新2个action方法原型(将返回类型从void更新为ActionResult),使用视图模板来返回HTML用户界面响应。接着,我们调用Controller基类的View()方法来返回ViewResult对象。
    public class DinnersController : Controller
    {
        DinnerRepository dinnerRepository = new DinnerRepository();
        //
        // GET: /Dinners/
        public ActionResult Index()
        {
            var dinners = dinnerRepository.FindUpcomingDinners().ToList();
 
            return View("Index", dinners);
        }
        //
        // GET: /Dinners/Details/2
        public ActionResult Details(int id)
        {
            Dinner dinner = dinnerRepository.GetDinner(id);
 
            if (dinner == null)
                return View("NotFound");
            else
                return View("Details", dinner);
        }
    }
 
上面代码中,我们使用的View() 辅助方法的原型如下:
ViewResult View(string viewName, object model);
 
View() 辅助方法的第一个参数是view模板文件,用来生成HTML响应。第二个参数是model对象,包含了view模板生成HTML响应所需要的数据。
 
在Index() action方法中,我们调用View() 辅助方法,表示我们将使用Index视图模板来生成HTML形式的宴会(dinners)列表。我们传递一组Dinner对象给view模板,用来生成清单。
在Details() action 方法中,我们通过id值检索特定的Dinner对象。如果有找到Dinner对象,则调用View() 方法,使用Details 视图模板展示检索到的Dinner对象。如果没有找到Dinner对象,则使用NotFound视图模板展示一个错误信息,表示Dinner对象不存在(一个重载的View() 方法仅仅需要传入视图模板名称 – View(“NotFound”))。
 
下面,我们开始实现NotFound、Details、和Index视图模板。
 
实现NotFound视图模板
我们开始实行NotFound视图模板 – 显示一条友好的错误信息,说明请求的宴会(dinner)没有找到。
首先将光标定位在一个controller action方法体中,然后右键点击,在弹出菜单中选择Add View菜单项,就可以创建一个新的视图模板了,如下图所示。
 

 
在弹出的Add View 对话框,输入NotFound,如下图所示。默认情况下,对话框中的视图名称就与光标所在的action方法中的视图名称一致,这里为Details。因为我们第一步实现NotFound视图模板,因此在这里需要更名为NotFound。
 
 
点击Add按钮,Visual Studio 将在\Views\Dinners目录创建一个新的NotFound.aspx 视图模板,如果该目录不存在,也会自动创建目录。
默认情况下,视图模板有2个content regions,可以用来放置内容和代码。第一块允许我们定制HTML页面的标题,第二块允许我们定制HTML页面的主要内容(main content)。
 
 
为了实现NotFound实体模板,我们添加了一些基本的内容,如下图所示:
 
 
下面运行NerdDinner范例程序,并在浏览器地址栏输入:/Dinners/Details/9999。该dinner在数据库中根本不存在,因此DinnersController.Details() action 方法将呈现NotFound视图模板,如下图所示:
 
 
你可能会注意到上图中,我们创建的视图模板继承了其他HTML脚本,显示在主要内容周围。这是因为我们创建的视图模板使用了Master Page模板,在整个站点实现一致的布局效果。在本章后续部分,我们会介绍更多关于Master Page的技术。
 
 
今天就到这里了,明天继续翻译ASP.NET MVC eBook – 开发NerdDinner 范例程序向导。欢迎访问http://blog.EntLib.com 博客平台获取更多的MVC学习资料。
 
相关资源下载链接:
1. ASP.NET MVC 1.0 正式版发布了!!!
 
2. 免费ASP.NET MVC eBook 向导-电子书下载
 

 

发表 @ 2009年3月30日 23:30

打 印

评论

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

Left by 李晓雷 at 2009/3/30 23:35
Gravatar
挺好的,我刚看完7,一刷页面就出现8了,效率真高啊,谢了

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

Left by entlibforum at 2009/3/30 23:37
Gravatar
谢谢~~~欢迎交流~~~

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

Left by Jxw at 2009/7/22 21:56
Gravatar
我的怎么弹出来的 Add View对话框只有View Name;Create a strongly-typed class; Select master page三项 而且点了Add没反应
谢谢!@.@

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

Left by nnn at 2010/1/2 12:08
Gravatar
发现一个问题,添加的view 默认在 view文件夹内,提示找不到该view,我手动拖到share里面才可以。

您的评论:



 (不显示)


 
 
 
Please add 5 and 6 and type the answer here:
    
 

评论预览窗口:

 
«三月»
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910