[译]ASP.NET MVC动手实验1-2:创建ASP.NET MVC应用

任务3 – 理解控制器

在不使用 MVC 框架的 ASP.NET 应用中,用户交互围绕页面进行组织, 并通过这些页面中的事件来进行交互处理。与此不同的是,在 ASP.NET MVC 应用中, 用户交互由控制器以及他们所包含的行为方法来进行组织和处理。

ASP.NET MVC 框架将 URLs 映射到指向相关控制器的类。 控制器处理请求, 处理用户输入和交互操作, 并执行对应的应用逻辑。 一个控制器类通常调用一个单独的视图组件来为请求生成 HTML 标记。 在 MVC 应用中,视图只负责信息呈现;控制器处理和响应用户输入和交互。

  1. 打开 Home Controller:在解决方案浏览器中,双击 Controllers 目录下的 HomeController.cs 文件。 提示: MVC 框架的默认行为要求所有控制器类以“Controller”作为后缀。如果有必要的话,可以改变这个约定。 所有的控制器类必须实现 IController 接口(或者从 Controller 基类继承, Controller 基类已经实现 IController 接口)。 控制器中对行为和方法进行定义。在 MVC Web 应用的典型工作流程下, 控制器行为和方法处理传入的 Web 请求。 这些行为和方法使用传入参数值来执行应用代码,获取和更新数据库中的数据模型对象, 然后选择一个视图进行渲染,对浏览器进行输出。
[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}
*示例代码:控制器、行为和方法。*提示: **[HandleError]** 过滤器属性在 ASP.NET MVC 请求发生错误时,为控制器、行为和方法提供友好的错误显示。 提示:注意方法的名称是与请求URL中的行为绑定的。要使一个行为方法可以调用,该行为方法的保护级别必须是 public, 并且没有附加 **[NonActionAttribute]** 属性。 行为方法必须返回 **ActionResult** 实例。 Action Result 是控制器行为执行后的返回结果, 用于响应浏览器请求。Action Result 可以包括: 渲染视图、重定向到其它行为、重定向到其它页面等。 ASP.NET MVC 框架支持多种 Action Results 类型,包括: - **ViewResult**:呈现 HTML 和 标记。 - **EmptyResult:** 不呈现结果。. - **RedirectResult**: 重定向到一个新的URL。 - **JsonResult**: 输出一个可以用于 AJAX 应用的 JavaScript 对象。 - **JavaScriptResult**: 输出 JavaScript 脚本。 - **ContentResult**: 输出文本。 - **FileContentResult**: 输出可下载的文件(二进制内容)。 - **FilePathResult**: 输出可下载的文件(文件路径)。 - **FileStreamResult**: 输出可下载的文件(文档流)。 在上面的实例代码中,控制器行为没有返回 ViewResult(), 而是使用了 Controller 基类中的 View() 方法。正常情况下,你不必直接返回 ActionResul, 而是调用下面所列的 Controller 基类方法之一: - **View**: 返回 **ViewResult** 作为行为结果。 - **Redirect**: 返回 **RedirectResult** 作为行为结果。 - **RedirectToAction**: 返回 **RedirectToRoutResult** 作为行为结果(重定向到指定的行为)。 - **RedirectToRoute**: 返回 **RedirectToRoutResult** 作为行为结果(重定向到指定的路径)。 - **Json**: 返回 **JsonResut** 作为行为结果。 - **JavaScriptResult**: 返回 **JavaScriptResult**。 - **Content**: 返回 **ContentResult** 作为行为结果。 - **File**: 根据传入到方法的参数返回 **FileContentResult**、 **FilePathResult** 或者 **FileStreamResult**。 了解更多信息,请参见:<http://www.asp.net/learn/mvc/tutorial-03-cs.aspx>。

2. 视图可以根据控制器类提供的特定的数据只渲染自身的输出。在 ASP.NET MVC 框架中我们把这些特定的数据成为 ViewData。提示:要向视图传递数据,你可以使用 ControllerBase 类的 ViewData 属性。该属性返回一个 ViewDataDictionary 对象,对象中包含大小写敏感的字符串型的键值。在本实验中你可以使用 ViewData 字典或者强类型数据。注意在 Home 控制器中的方法在 ViewData 中设置值并调用关联的控制器的 View 方法来返回视图。

public ActionResult Index()
{
    ViewData["Message"] = "Welcome to ASP.NET MVC!";

    return View();
}