在传统的Web应用程序中,输入的URL通常被映射为一个磁盘文件。例如:一个类似“/Products.aspx”或“/Products.php”的URL请求会由一个“Products.aspx”或“Products.php”文件来进行处理。
作为编写我们的MVC书店应用程序的第一步,我们追加一个控制器类,它处理对于应用程序中主页的URL请求。我们遵循ASP.NET MVC中默认的命名约定,将之命名为HomeController。
鼠标右击解决方案资源管理器中的Controllers文件夹,点击添加-〉控制器,如图2-1所示。
![ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器 ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器](http://img.e-com-net.com/image/product/902db316dad541b2b718ad14f78c9108.jpg)
图2-1 添加控制器
在弹出的“添加控制器”对话框中,将控制器命名为“HomeController”,如图2-2所示,然后点击添加按钮。
![ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器 ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器](http://img.e-com-net.com/image/product/49330030f8ff4fa6befdd06cc9a3a547.jpg)
图2-2 命名控制器
观察解决方案资源管理器,Controllers文件夹中新增加了一个文件,名字为HomeController.cs,并且该文件呈打开状态,文件中代码如代码清单2-1所示。
代码清单2-1 HomeController.cs文件中的默认代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcMusicStore.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
}
}
这段代码是一个控制器类中最简单的代码。接下来让我们修改Index方法为一个简单的返回一个字符串的方法。我们将执行如下两个简单修改:
- 将返回ActionResult对象的Index方法修改为返回一个字符串的方法(方法头部)。
- 将返回(return)语句修改为返回“主页”。
代码如下所示。
public string Index()
{
return "主页";
}
2.2 运行应用程序
现在让我们运行这个应用程序。我们可以使用以下几种方法来运行。
- 点击“调试”菜单下的“启动调试”子菜单。
- 点击工具条中的绿色按钮,如图2-3所示。
![ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器 ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器](http://img.e-com-net.com/image/product/7f39735ecba8481d87af678c1a16343d.jpg)
图2-3 点击工具按钮运行应用程序
使用其中的任何一种方法都会进行我们的应用程序的编译工作,然后运行一个Visual Web Developer中内置的ASP.NET开发服务器。屏幕的右下角会出现一个小的服务器图标,标示ASP.NET开发服务器已经运行,并且显示服务器所使用的端口号,如图2-4所示。
![ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器 ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器](http://img.e-com-net.com/image/product/833da504618d498abc5e8f6106a20edf.jpg)
图2-4 ASP.NET开发服务器图标
接着,Visual Web Developer将会打开一个浏览器窗口,其地址指向我们的应用程序在开发服务器中的地址,如图2-5所示。这使得我们可以迅速地看见我们的应用程序的起始页面。
![ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器 ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器](http://img.e-com-net.com/image/product/beef8d714cb84aaca785ec468a4d427b.jpg)
图2-5 应用程序的起始页面在浏览器中的显示
OK,这一切都是非常方便快捷的—我们创建了一个新的Web网站,追加了一个三行的方法,在浏览器中查看到了我们指定返回的文字。
注意:在Visual Studio中内置了一个ASP.NET开发服务器,它将在你的计算机中随机挑选一个端口来运行。在图2-5中,网站运行在“http://localhost:1099/”下,所以端口号为1099。在不同的计算机中,该端口号可能都不相同。假定一个端口号为1099,则本文中“/Store/Browse”表示网址“http://localhost:1099/ Store/Browse”。
2.3 追加一个书籍展示控制器
我们已经添加了一个简单的主页控制器,用来显示我们网站中的主页。现在让我们追加另一个控制器,用来展示我们书店中的各种书籍。我们的书籍展示控制器负责处理以下几个页面:
现在我们来追加一个新的StoreController类。在这之前,首先需要通过关闭浏览器或点击调试菜单下的停止调试子菜单来停止应用程序的运行。
接下来,就像之前追加HomeController控制器那样,来追加一个新的StoreController控制器。鼠标右击解决方案资源管理器中的 “Controllers”文件夹,点击添加-〉控制器,并且将其命名为StoreController,如图2-6所示。
![ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器 ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器](http://img.e-com-net.com/image/product/4a0e45d875b64799bbf574c0a0040d9d.jpg)
图2-6 追加StoreController控制器
点击添加按钮后,查看Controllers文件夹,新增加了一个StoreController.cs文件。查看该文件中的代码,已经自动追加了一个 Index方法。我们将利用这个Index方法来映射列举显示我们书店中所有书籍种类的页面。同时我们将另外追加两个方法来映射其他两个页面: 列举显示某个种类中所有书籍的页面与详细显示单本书籍信息的页面,分别将之命名为Browse方法与Details方法。
在ASP.NET MVC3中,在StoreController控制器中的这些方法(Index,Browse与Details)被称为“控制器中的action方法”。 这些action方法专门被用来响应来自URL的请求,并且决定当用户输入这些URL地址时应该向浏览器或用户返回什么内容。
现在我们修改StoreController控制器中的Index方法,使其返回“StoreController控制器中Index方法的返回内容”,并且用类似的方法修改Browse方法与Detais方法。代码如代码清单2-2所示。
代码清单2-2 StoreController.cs文件中的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcBookStore.Controllers
{
public class StoreController : Controller
{
//
// GET: /Store/
public string Index()
{
return "StoreController控制器中Index方法的返回内容";
}
//
// GET: /Store/Browse
public string Browse()
{
return "StoreController控制器中Browse方法的返回内容";
}
//
// GET: /Store/Details
public string Details()
{
return "StoreController控制器中Details方法的返回内容";
}
}
}
重新运行应用程序,并分别在浏览器中访问“/Store”,“/Store/Browse”,“/Store/Details”这些URL地址。访问这些地址会分别调用控制器中的Index方法、Browse方法与Details方法,并返回相应的字符串,譬如访问“/Store/Details”时浏览器中的显示内容如图2-7所示。
![ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器 ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器](http://img.e-com-net.com/image/product/14e5195f07a84ed4a7509511ccdf77a9.jpg)
图2-7 访问“/Store/Details”时浏览器中的显示内容
现在这些方法中返回的都是固定的字符串。现在我们继续修改这些方法,使其可以返回动态内容,譬如读取URL地址中的一些信息然后显示在页面中。
首先我们修改Browse这个action方法,使其读取URL地址中的一个参数值。我们可以通过在action方法的传入参数中追加一个genre参数来实现这一功能,当调用这个action方法时,ASP.NET MVC可以自动地将URL地址中的参数字符串或表单提交参数中的genre参数值自动传入这个action方法中。
//
// GET: /Store/Browse?genre=?Disco
public string Browse(string genre)
{
string message = HttpUtility.HtmlEncode("StoreController控制器中Details
方法的返回内容, Genre = "+ genre);
return message;
}
注意:代码中使用了HttpUtility.HtmlEncode方法对用户输入进行了编码操作。这样可以防止用户使用类似 “Store/Browse?Genre=<script>window.location=’http: //hackersite.com’</script>.”之类的方法来强行注入JavaScript语句。
现在让我们重新运行应用程序,并在地址栏中输入“/Store/Browse?Genre=novel”,浏览器中的显示如图2-8所示。(对于中文参数 的处理要稍微复杂一些,一般采用按ID编号查询的方式,譬如数据表中小说类的ID编号为4,参数字符串为“/Store /Browse?Genre=4”)
![ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器 ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器](http://img.e-com-net.com/image/product/1429d63088714252ba6756e9149af458.jpg)
图2-8 URL地址中输入参数后的显示结果
接下来让我们修改Details这个action,使其可以读取并显示输入的ID参数。与之前的处理方法稍有不同,我们不用在参数字符串中加入ID参数,我们可以直接使用URL地址本身来加入ID参数,譬如:“/Store/Details/5”。
对于读取URL地址中ID参数的处理,ASP.NET MVC不需要我们另外进行任何设置,它的默认的路由约定会将一个URL地址中action方法后的一段地址区段自动设定为ID参数。如果你的action方法中有一个名字叫ID的参数,ASP.NET MVC自动将地址栏中的ID参数传入action方法中的ID参数中。
//
// GET: /Store/Details/5
public string Details(int id)
{
string message = "StoreController控制器中Details方法的返回内容, ID = " + id;
return message;
}
重新运行应用程序,并且访问“/Store/Details/5”,浏览器中显示结果如图2-9所示。
![ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器 ASP.NET <wbr>MVC3书店--第二节 <wbr>控制器](http://img.e-com-net.com/image/product/28969000bb504aae9c144a80531ecc88.jpg)
图2-9 使用ID参数后浏览器中的显示结果
现在让我们回顾一下我们已经完成了哪些工作:
- 我们已经在Visual Web Developer中创建了一个新的Web项目。
- 我们已经了解了在一个ASP.NET MVC应用程序中有哪些最基本的文件夹以及它们的用途。
- 我们已经知道了应该怎样运行一个Web应用程序。
- 我们已经创建了两个控制器类:一个HomeController控制器与一个StoreController控制器。
- 我们已经在我们的控制器中追加了一些Action方法,用来响应来自URL的请求,并且向浏览器返回文字。