ASP.NET MVC 控制器概述 (C#)

作者 :Stephen Walther

在本教程中,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 框架支持多种类型的操作结果,包括:

  1. ViewResult - 表示 HTML 和标记。
  2. EmptyResult - 不代表任何结果。
  3. RedirectResult - 表示重定向到新 URL。
  4. JsonResult - 表示可在 AJAX 应用程序中使用的 JavaScript 对象表示法结果。
  5. JavaScriptResult - 表示 JavaScript 脚本。
  6. ContentResult - 表示文本结果。
  7. FileContentResult - 表示具有二进制内容) (的可下载文件。
  8. FilePathResult - 表示具有路径) 的可下载文件 (。
  9. 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 基类的以下方法之一:

  1. View - 返回 ViewResult 操作结果。
  2. 重定向 - 返回 RedirectResult 操作结果。
  3. RedirectToAction - 返回 RedirectToRouteResult 操作结果。
  4. RedirectToRoute - 返回 RedirectToRouteResult 操作结果。
  5. Json - 返回 JsonResult 操作结果。
  6. JavaScriptResult - 返回 JavaScriptResult。
  7. 内容 - 返回 ContentResult 操作结果。
  8. 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。