一步一步学习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的技术。
相关资源下载链接:
1. ASP.NET MVC 1.0 正式版发布了!!!
2. 免费ASP.NET MVC eBook 向导-电子书下载