ASP.NET MVC 控制器概述 (C#)
在本教程中,Stephen Walther 介绍了如何 ASP.NET MVC 控制器。 你将了解如何创建新控制器并返回不同类型的操作结果。
本教程探讨 ASP.NET MVC 控制器、控制器操作和操作结果的主题。 完成本教程后,你将了解如何使用控制器来控制访问者与 ASP.NET MVC 网站交互的方式。
了解控制器
MVC 控制器负责响应针对 ASP.NET MVC 网站发出的请求。 每个浏览器请求都映射到特定的控制器。 例如,假设在浏览器的地址栏中输入以下 URL:
http://localhost/Product/Index/3
在这种情况下,将调用名为 ProductController 的控制器。 ProductController 负责生成对浏览器请求的响应。 例如,控制器可能会将特定视图返回给浏览器,或者控制器可能会将用户重定向到另一个控制器。
清单 1 包含名为 ProductController 的简单控制器。
Listing1 - Controllers\ProductController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
//
// GET: /Products/
public ActionResult Index()
{
// Add action logic here
return View();
}
}
}
如清单 1 所示,控制器只是 Visual Basic .NET 或 C# 类) (类。 控制器是派生自基本 System.Web.Mvc.Controller 类的类。 由于控制器继承自此基类,因此控制器会免费继承几个有用的方法 (我们将在) 稍后讨论这些方法。
了解控制器操作
控制器公开控制器操作。 操作是控制器上的一种方法,当你在浏览器地址栏中输入特定 URL 时,将调用该方法。 例如,假设你对以下 URL 发出请求:
http://localhost/Product/Index/3
在这种情况下,对 ProductController 类调用 Index () 方法。 Index () 方法是控制器操作的示例。
控制器操作必须是控制器类的公共方法。 默认情况下,C# 方法是专用方法。 请注意,添加到控制器类的任何公共方法都会作为控制器操作自动公开 (必须小心,因为只需在浏览器地址栏中键入正确的 URL) 即可调用控制器操作。
控制器操作必须满足一些其他要求。 用作控制器操作的方法不能重载。 此外,控制器操作不能是静态方法。 除此之外,可以使用任何方法作为控制器操作。
了解操作结果
控制器操作返回称为 操作结果的内容。 操作结果是控制器操作为响应浏览器请求而返回的内容。
ASP.NET MVC 框架支持多种类型的操作结果,包括:
- ViewResult - 表示 HTML 和标记。
- EmptyResult - 不代表任何结果。
- RedirectResult - 表示重定向到新 URL。
- JsonResult - 表示可在 AJAX 应用程序中使用的 JavaScript 对象表示法结果。
- JavaScriptResult - 表示 JavaScript 脚本。
- ContentResult - 表示文本结果。
- FileContentResult - 表示具有二进制内容) (的可下载文件。
- FilePathResult - 表示具有路径) 的可下载文件 (。
- FileStreamResult - 表示具有文件流) 的可下载文件 (。
所有这些操作结果都继承自基本 ActionResult 类。
在大多数情况下,控制器操作返回 ViewResult。 例如,清单 2 中的索引控制器操作返回 ViewResult。
清单 2 - Controllers\BookController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcApplication1.Controllers
{
public class BookController : Controller
{
public ActionResult Index()
{
// Add action logic here
return View();
}
}
}
当操作返回 ViewResult 时,HTML 将返回到浏览器。 清单 2 中的 Index () 方法向浏览器返回名为 Index 的视图。
请注意,清单 2 中的 Index () 操作不返回 ViewResult () 。 而是调用 Controller 基类的 View () 方法。 通常,不会直接返回操作结果。 而是调用 Controller 基类的以下方法之一:
- View - 返回 ViewResult 操作结果。
- 重定向 - 返回 RedirectResult 操作结果。
- RedirectToAction - 返回 RedirectToRouteResult 操作结果。
- RedirectToRoute - 返回 RedirectToRouteResult 操作结果。
- Json - 返回 JsonResult 操作结果。
- JavaScriptResult - 返回 JavaScriptResult。
- 内容 - 返回 ContentResult 操作结果。
- File - 根据传递给 方法的参数返回 FileContentResult、FilePathResult 或 FileStreamResult。
因此,如果要将视图返回到浏览器,请调用 View () 方法。 如果要将用户从一个控制器操作重定向到另一个控制器操作,可以调用 RedirectToAction () 方法。 例如,清单 3 中的 Details () 操作显示视图或将用户重定向到 Index () 操作,具体取决于 Id 参数是否具有值。
清单 3 - CustomerController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class CustomerController : Controller
{
public ActionResult Details(int? id)
{
if (!id.HasValue)
return RedirectToAction("Index");
return View();
}
public ActionResult Index()
{
return View();
}
}
}
ContentResult 操作结果很特殊。 可以使用 ContentResult 操作结果以纯文本形式返回操作结果。 例如,清单 4 中的 Index () 方法以纯文本而不是 HTML 形式返回消息。
清单 4 - Controllers\StatusController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class StatusController : Controller
{
public ActionResult Index()
{
return Content("Hello World!");
}
}
}
调用 StatusController.Index () 操作时,不会返回视图。 而是将原始文本“Hello World!”返回到浏览器。
如果控制器操作返回的结果不是操作结果(例如,日期或整数),则结果将自动包装在 ContentResult 中。 例如,当调用清单 5 中 WorkController 的 Index () 操作时,日期将自动作为 ContentResult 返回。
清单 5 - WorkController.cs
using System;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class WorkController : Controller
{
public DateTime Index()
{
return DateTime.Now;
}
}
}
列表 5 中的 Index () 操作返回 DateTime 对象。 ASP.NET MVC 框架将 DateTime 对象转换为字符串,并将 DateTime 值自动包装在 ContentResult 中。 浏览器以纯文本形式接收日期和时间。
总结
本教程的目的是介绍 ASP.NET MVC 控制器、控制器操作和控制器操作结果的概念。 在第一部分中,你已了解如何将新控制器添加到 ASP.NET MVC 项目。 接下来,你了解了控制器的公共方法如何作为控制器操作向宇宙公开。 最后,我们讨论了可以从控制器操作返回的不同类型的操作结果。 具体而言,我们讨论了如何从控制器操作返回 ViewResult、RedirectToActionResult 和 ContentResult。