在典型的 Web 应用中,用户请求的 URL 地址通常映射到保存在网站中的文件上,例如,当用户请求 /Products.aspx 的时候,或者 /Products.php 的时候,很可能是在通过处理 Products.aspx 或者 Products.php 文件来完成任务。

ASP.NET MVC 的处理方式则不同,它没有映射到文件上,相反,将这些 URL 地址映射到类的方法上,这些类被称为“控制器”,控制器用来接受 HTTP 请求,处理用户的输入,获取或者保存数据,其中的处理方法称为 Action,然后将回应发送到客户端,可能是显示了一个 HTML 的网页,下载一个文件,重定向到另外一个地址等等。

默认的路由配置

在新创建的项目中,打开 Global.asax.cs 文件,可以看到如下的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing; namespace MvcMusicStore
{
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
// 请访问 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
} public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
} // 一般用来进行网站的初始化
protected void Application_Start()
{
System.Data.Entity.Database.SetInitializer(new MvcMusicStore.Models.SampleData()); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
}

其中 RegisterRoutes 方法注册了默认的路由配置,在方法中的 routes.MapRoute 语句中,请求地址将会被看成三个部分组成,{controller}/{action}/{id},第一部分称为控制器,如果没有提供的话,默认为 Home, 第二部分称为  Action 方法,如果没有提供的话,默认为 Index, 第三部分称为 id, 通常用来提供数据的标识,没有默认值。这样,当请求 / 地址的时候,系统将会把请求映射到名为 Home 的控制器进行处理,调用其中名为 Index 的方法处理请求。

增加 HomeController

我们的应用商店从增加一个首页的控制器开始,使用默认的命名约定,控制器的名称应该以 Controller 作为后缀,我们将这个控制器命名为 HomeController。

在 Controller 文件夹上右击,然后选择“添加”,“控制器(T)…”

在弹出的对话框中,输入控制器的名字 HomeController,按下“添加”按钮。

这样,将会创建一个名为 HomeController.cs 的文件,其中的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcMusinStore.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/ public ActionResult Index()
{
return View();
} }
}

为了尽可能地简单,我们让 Index 方法简单地返回一个字符串,这个字符串将作为回应内容直接返回浏览器,我们做下面的两个简单修改。

  • 将方法的返回类型修改为string
  • 将返回语句修改为 return "Hello form Home";

这样,我们的方法将会变成如下的内容

public string Index()
{
return "Hello form Home";
}

运行程序

现在,可以运行一下了,我们可以启动服务器,使用下面的任何一种方法都可以。

  • 选择“调试”,“启动调试”菜单
  • 点击工具栏上的绿色的箭头按钮
  • 使用键盘快捷方式,F5

使用上面的任何一种方法都会导致编译项目,启动 Visual Studio 中内建的 ASP.NET 开发服务器.

在屏幕的右下角会弹出一个启动 ASP.NET 开发服务器的提示,

Visual Studio 将自动打开一个浏览器窗口,其中的地址指向我们的 Web 服务器,这使得我们可以快速使用我们的程序。

Ok, 非常的简单,我们已经创建了一个 Web 站点,写了一个三行的函数,在浏览器中得到了这行文字, 不是很震撼,但这仅仅只是开始。

增加 StoreController

我们已经为站点增加一个简单的 HomeController 作为首页,现在,增加另外一个控制器,可以用来浏览我们的音乐商店,我们的商店控制器将要支持三个场景:

  • 列出商店中的唱片的分类
  • 浏览商店中某个分类中的唱片列表
  • 显示特定唱片的详细信息

我们从增加一个新的 StoreController 开始,先停止刚才的程序,可以直接关闭浏览器,或者也可以在调试菜单中,选择停止调试。

现在,增加一个新的 StoreController,像在 HomeController 中做的一样,我们在 Controllers 文件夹上右健,选择“添加”,“控制器”.

新的 StoreController 控制器中已经包含了 Index 方法,我们使用这个方法来实现列出所有分类的列表,我们还会再增加两个额外的方法来实现其他的场景:浏览和明细。

这些包含在控制器中的方法,我们称为控制器中的 Action,像你在前面看到的,HomeController 中的 Index 方法就是一个 Action,这些 Action 的作用就是处理请求,然后返回对请求的处理结果。

对于我们的 StoreController ,首先让 Index 这个 Action 返回一个“Hello” 串,然后,增加两个方法:Browse() 和 Detials()

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcMusinStore.Controllers
{
public class StoreController : Controller
{
//
// GET: /Store/ public string Index()
{
return "Hello from Store.Index()";
} public string Browse()
{
return "Hello from Store.Browse()";
} public string Details()
{
return "Hello from Store.Details()";
} }
}

重新运行程序,现在已经可以访问这些地址了。

  • /Store
  • /Store/Browse
  • /Store/Details

太棒了,但是现在仅仅能够返回一些常量的字符串,让我们将它们变成动态的,我们从 URL 中获取一些信息,然后把他们显示在返回的页面中。

首先,修改我们的 Browse 这个 Action,使得它可以从 URL 地址中获取查询信息,为方法增加一个名为“genre” 的字符串类型参数,当我们这样做的时候,ASP.NET MVC 就会自动把任何名为 genre 的请求参数的值赋予这个参数。

//
// GET: /Store/Browse?genre=?Disco
public string Browse(string genre)
{
string message = HttpUtility.HtmlEncode("Store.Browse, Genre = " + genre);
return message;
}

注意:

我们使用了HttpUtility.HtmlEncode 方法来处理用户的输入,这样可以防止用户的脚本注入攻击。例如:/Store/Browse?Genre=<script>window.location=’http://hackersite.com’</script>.

现在,我们在浏览器中访问一下:/Store/Browse?Genre=Disco

下一步,我们处理 Details 这个 Action,使它能够处理名为 ID 的整数类型参数。这次,我们不再在请求参数中传递这个整数,而是嵌在请求的 URL 地址中。例如:/Store/Details/5。

在 ASP.NET MVC 中,我们可以轻易地完成这个任务而不需要配置任何东西,ASP.NET MVC 默认的路由约定会将跟在 Action 方法之后的部分看作名为 ID 的参数的值,如果你的 Action 方法有一个名为 ID 的参数,那么,ASP.NeT MVC 就会自动将这部分作为参数传送给 Action 方法,需要注意的是,MVC 可以帮助你完成数据类型之间的转换,所以,地址的第三部分一定要可以转换为整数。

//
// GET: /Store/Details/5
public string Details(int id)
{
string message = "Store.Details, ID = " + id;
return message;
}

再次运行程序访问/Store/Details/5

总结一下我们完成的任务:

  • 创建了一个 ASP.NET MVC 项目
  • 讨论了基本的项目文件夹
  • 学习了如何运行开发服务器
  • 创建了两个控制器 HomeController 和 StoreController
  • 为控制器增加了 Action 方法。

ASP.NET MVC 音乐商店 - 2.控制器的更多相关文章

  1. ASP.NET MVC 音乐商店 - 目录

    这一个系列的内容来自微软的音乐商店 Music Store, 这是项目在 Codeplex 上的地址:http://mvcmusicstore.codeplex.com/. 这个项目使用 ASP.NE ...

  2. ASP.NET MVC 音乐商店 - 3. 视图与模型

    上一篇中使用字符串,这一篇我们就开始使用视图来处理. 我们已经可以从控制器的 Action 中返回一个字符串,这可以帮助我们更好地理解 Controller 是如何工作的.但是对于创建一个 Web 程 ...

  3. ASP.NET MVC 音乐商店 - 0 概览

    这是一个系列文章,原文内容出自微软的 MusicStore. 首先对原文内容进行了简单的翻译,以方便大家参考,另外对于其中的部分内容,也进行了简单的分析,使用的 Visual Studio 也换成了中 ...

  4. ASP.NET MVC 音乐商店 - 5 通过支架创建编辑表单 续

    查看 StoreManager 控制器的代码 现在,Store Manager 控制器中已经包含了一定数量的代码,我们从头到尾重新过一下. 首先,在控制器中包含了标准的 MVC 控制器的代码,为了使用 ...

  5. ASP.NET MVC 音乐商店 - 5. 通过支架创建编辑表单

    在上一章,我们已经从数据库获取数据,然后显示出来,这一章,我们将允许编辑数据. 创建 StoreManagerController 控制器 我们将要创建称为 StoreManager 的控制器,对于这 ...

  6. ASP.NET MVC 音乐商店 - 1 创建项目

    我们的项目从在 Visual Studio 中的文件菜单中选择“新建”,选择“项目”开始. 然后,选择 C# 中的 Web 模板组,在右边的项目模板中选择 ASP.NET MVC3 Web 应用程序, ...

  7. ASP.NET MVC 音乐商店 - 6. 使用 DataAnnotations 进行模型验证

    在前面的创建专辑与编辑专辑的表单中存在一个问题:我们没有进行任何验证.字段的内容可以不输入,或者在价格的字段中输入一些字符,在执行程序的时候,这些错误会导致数据库保存过程中出现错误,我们将会看到来自数 ...

  8. ASP.NET MVC 音乐商店 - 4. 数据访问

    上一次,我们使用了模拟的数据从控制器发送到视图模板.现在,我们开始使用真正的数据库,在这个教程中,我们将指导如何使用 SQL Server Compact 版的数据库,它经常被称为 SQL CE, 来 ...

  9. MVC 音乐商店 第 8 部分: 购物车与 Ajax 更新

    MVC 音乐商店是介绍,并分步说明了如何使用 ASP.NET MVC 和 Visual Studio 为 web 开发教程应用程序. MVC 音乐商店是一个轻量级的示例存储实现它卖音乐专辑在线,并实现 ...

随机推荐

  1. LCA SP913 QTREE2 - Query on a tree II

    SP913 QTREE2 - Query on a tree II 给定一棵n个点的树,边具有边权.要求作以下操作: DIST a b 询问点a至点b路径上的边权之和 KTH a b k 询问点a至点 ...

  2. 黑马MySQL数据库学习day04 MySQL变量 存储过程 用户和授权管理

    /* MySQL中的变量局部变量,用户变量,会话变量和全局变量. 用户变量不用定义,直接使用. 1.用户变量赋值 set @xxx = 值; 2.查询 select @xxx; 语法帮助: 过程保存在 ...

  3. swift3.0 原生网络请求

    func loadData()  { let urlString = baseURL + NewsListURL + "\(self.page)"+"/20" ...

  4. 2018-2019-2 20165320 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165320 <网络对抗技术> Exp6 信息搜集与漏洞扫描 一.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 二.实践内容 1.各种搜索技巧应用 ...

  5. json几种读取方式,ArrayList循环读取【转】

    在之前写过提取json数据格式的文章,这次对jmeter读取json数据格式进行整理. 举例一个接口的response 格式如下: { "data" : { "devic ...

  6. git命令行操作:拉不到最新代码???

    现场场景:   仓库中有一个包名使用了驼峰命名,还有一个非驼峰的同名包, windows系统下因为不区分文件夹大小写,拉取没问题,但是本地push不上去.打算到Linux上clone下来后,删除那个驼 ...

  7. 用HTMLParser解析html时报错:No module named 'htmlentitydefs'

    python3.6用HTMLParser解析html时报错 No module named 'htmlentitydefs'或No module named 'markupbase' 先上代码 fro ...

  8. Day03 知识点

    一.单行注释与多行注释 # 用来标记不运行的程序 pycharm 快捷键 ctrl+/ 可以在程序上方 也可以在程序后面 (PEP8) 多行注释 用三引号,一般推荐三双引号来做注释. 二.数据类型 ( ...

  9. angularJs(1)指令篇

      angularJs模板 <!DOCTYPE html> <html> <head lang="en"> <meta charset=& ...

  10. 26-----BBS论坛

    BBS论坛(二十六) 26.发布帖子前台代码逻辑完成 (1)front/hooks.py from .views import bp from flask import session,g from ...