本章将使用 ASP.NET MVC 框架创建一个简单的数据录入应用程序。
笔者会将过程分解成一个个的步骤,以便能够看出如何构造 ASP.NET MVC 应用程序。(对于一些未进行解释的内容,笔者提供了参考章节,在那里你会看到完整的细节)
(由于各个 VS 版本不一样,有些功能用不了的话可以通过“工具”、“设置”、“专家设置”启用全部特性(新的版本可能不需要这一步))
第一步:创建新的 ASP.NET MVC 项目
1、“新建项目”——“Web(Visual C#)”——“ASP.NET Web 应用程序”
2、设置文件名、存储路径,单击“确定”按钮。
3、(该模板创建的项目带有不同的起点和特性配置,如认证、导航以及视觉主题等)为了保持事情简单,选择“空模板”选项,并在“添加文件夹和核心引用”部分勾选“MVC”复选框。(这会创建一个基本的 MVC 项目,它带有最少的预定义内容,这也是本书用于所有示例的起点)
(PS:其他模板选项意在为 ASP.NET 项目提供更为完整的起点。但笔者不喜欢这些模板,因为它们鼓励开发者将一些重要特性视为黑盒进行操作。本书的目标是为你提供知识并融合 MVC 应用程序的各个方面,因而本书所有示例使用的几乎是这个“空模板”)
第二步:添加一个控制器
在 MVC 体系架构中,输入请求是由控制器(Controller)来处理的。(在 ASP.NET MVC 中,控制器通常是一些继承于 “Syster.Web.Mvc.Controller” 的 C# 类。“Syster.Web.Mvc.Controller”是框架内置的控制器基类)
控制器中的每一个 public 方法(“类”,当然要有方法)都称为是一个动作方法——可以用某个 URL 通过 Web 来调用它执行一个动作。
MVC 约定,将控制器放在 Controllers 的文件夹中,该文件夹是在建立项目时创建的。
(提示:你不一定要遵循这一约定或其他大多数 MVC 约定,但笔者建议你还是遵循它——至少因为它有助于弄清本书示例的意思。(现在的编程方式提倡“约定优于配置”,这可以省去编程过程中很多琐碎的事情,故在可能的情况下,应当优先遵循约定))
对项目添加控制器步骤如下:
1、“右击“Controllers”文件夹”——“添加”——“控制器”
2、在“添加支架”对话框中,选择“MVC 5-空控制器”选项,然后单击“添加”按钮。
3、在“添加控制器”对话框中,将其名称设置为 “HomeController”,然后单击“添加”按钮。
(控制器名称有几个约定:提供的控制器名称应当指明其目的;默认的控制器名称为“Home”;控制器名称具有“Controller”后缀)
2.2.2 理解路由
除了模型、视图、控制器之外,MVC 应用程序还使用 ASP.NET 的路由系统——它决定如何将 URL 映射到控
制器和动作上。(当 Visual Studio 创建 MVC 项目时,会添加一些默认的路由,以使我们能够开始工作——你可以
请求以下任何一个 URL(“/”、“/Home”、“/Home/Index”),它们都会被引向 HomeController 上的 Index 动作。
(这受益于遵循 MVC 的约定——这里有一个名称为“HomeController ”的控制器))
如果不遵循这种约定,则需要修改路由,以指向所创建的替代控制器。(可以打开“App_Start文件夹”中的
“RouteConfig.cs文件”来查看和编辑路由配置。第16章和第17章将解释这个文件中的条目)对于这个简单示例,应用
默认配置就行了。
第三步:渲染 Web 页面
为了产生一个对浏览器的请求进行响应的 HTML,需要创建一个视图(View)。
1、修改控制器中的方法(在 HomeController.cs 文件中修改 Index 方法,以渲染一个视图)
public ViewResult Index ()
{ return View() ; }
当从一个动作方法返回一个 ViewResult 对象时,便是在指示 MVC 去渲染一个视图。(调用不带参数的View 方法,便可以
创建这个 ViewResult 对象。这是在告诉 MVC,去渲染该动作的默认视图)MVC 约定的另一个例子:视图是通过命名约定与动
作方法相关联的。(在 “Views”文件夹中将生成与方法具有相同名字的视图文件)
2、创建视图最简单的方法是要求 Visual Studio 来做这件事——在 HomeController.cs 文件的代码编辑窗口中定义 Index 动作
方法的任意地方右击,然后从弹出的菜单中选择“添加视图”。
3、在“添加视图”的对话框中配置待创建视图文件的初始内容:将“视图名”设置为“Index”(与该视图相关联的动作方法的名称,这是
另一个约定)——将“模板”设置为“空模板无模型”——让“创建为分部视图”和“使用布局页”复选框处于未选状态——单击“添加”按钮,
创建这一新的视图文件。
(Visual Studio 将在 Views Home 文件夹中创建一个名称为 “Index.cshtml” 的视图文件。这是 MVC 框架的另一个约定:视图
被放置在 Views 文件夹中,文件夹的结构是与其关联的控制器名称相对应的。)
该文件主要含有 HTML 语句。不同的是会看到如下所示的部分:
……
@{
Layout = null;
}
……
这是一个将由 Razor 视图引擎进行解释的表达式,Razor 引擎处理视图内容并生成发送给浏览器的 HTML。(这里是一个简单
的 Razor 表达式,它告诉 Razor 未选用布局——布局类似于发送给 HTML 模板)
在 Index.cshtml 的 div 中可以添加 “Hello World ( from the view )”,这一添加显示了用 HTML 标记显示出来的消息(而不
是由动作方法显示的字符串)。
在最初编辑 Index 动作方法时,它返回的是一个字符串值,这意味着 MVC 除了把这个字符串传递给浏览器之外,未做其他
事情。
现在,Index 方法返回了一个 ViewResult,MVC 框架渲染了一个视图并返回了它所产生的HTML。(这里并未告诉 MVC 应该
使用哪个视图,因此它会运用命名约定自动寻找一个视图。该约定是,视图包含在以控制器命名的文件夹之中,并且具有动作方法
的名称:Views /Home /Index.cshtml)
除了字符串和 ViewResult 对象之外,也可以从动作方法返回其他结果。例如,如果返回一个RedirectResult,浏览器将被重
定向到另一个 URL。这些对象统称为动作结果,它们都派生于ActionResult 类。(动作结果系统使开发者能够在动作中封装并重用
常用的响应,第17章将对其做更多介绍并演示一些更复杂的运用)
2.3.2 添加动态输出
Web 应用程序平台的关键是构造并显示动态输出。在 MVC 中,控制器的工作是构造一些数据,并将其传递给视图,而视图则
负责把它渲染成 HTML。
(现在有很多人都把“渲染”说成“呈现”,其实这种说法是不正确的。Web 页面从服务器到浏览器的整个呈现过程实际上分为三步:
第一步是通过视图引擎对视图文件进行解释,将视图文件中的代码转换成 HTML 标记,这一步叫做渲染;第二步是将渲染后的
HTML 标记传递给客户端浏览器,这一步是页面的传递;第三步是浏览器接收到 HTML 后对其进行处理并呈现为 Web 页面,这
一步才叫做呈现。由此可见,渲染是把页面的非 HTML 代码转换成 HTML 标记,这一步工作是由服务器完成的)
将数据从控制器传递给视图的一种方式是使用 ViewBag(视图包)对象,它是 Controller 基类的一个成员。ViewBag 是一种
动态对象,可以给它赋任意属性,使这些属性的值在随后渲染的视图中是可用的。
在 HomeController.cs 文件中设置一些视图数据:
public ViewResult Index()
{
int hour = DateTime.Now.Hour;
ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon";
return View();
}
当对 ViewBag.Greeting 属性进行赋值时,便是为视图提供数据。(Greeting 属性直到对其赋值的那一刻才会形成——这让
作者能够以自如而流畅的方式(即不必提前定义类)将数据从控制器传递给视图)
在视图中再次查阅 ViewBag.Greeting 属性,便可获得其数据值。
在 Index.cshtml 文件中接收 ViewBag 的数据值:
<div> @ViewBag.Greeting World ( from the view ) </div> (这里是一个 Razor 表达式)
当在控制器的 Index 方法中调用 View 方法时,MVC 框架会定位 Index.cshtml 视图文件,并要求 Razor 视图引擎解析该文
件的内容。Razor 会寻找类似于在该清单中所添加的这种表达式,并处理它们。(在这个例子中,处理该表达式意味着在视图
中插入作者在动作方法中赋给 ViewBag.Greeting 属性的值——这就是前面所提到的视图渲染过程)
对属性名称 Greeting 没有特别要求,用任意属性名来代替,照样会正常工作,只要在控制器中使用的名称与视图中使用
的名称相匹配即可。当然,通过对多个属性赋值,可以将多个属性值从控制器传递到视图。
【上半部分结束】