了解控制器、控制器操作和操作结果

这是 Visual C# 教程(转到 Visual Basic 教程

在本教程中,Stephen Walther 将向您介绍 ASP.NET MVC 控制器。您将了解如何创建新的控制器并返回不同类型的操作结果。

« 前一篇教程  |  下一篇教程 »

了解控制器、控制器操作和操作结果

本教程深入研究 ASP.NET MVC 控制器、控制器操作和操作结果。学习完本教程后,您将了解如何使用控制器控制访问者与 ASP.NET MVC 网站交互的方式。

了解控制器

MVC 控制器负责响应针对 ASP.NET MVC 网站发出的请求。每个浏览器请求被映射到一个特定的控制器。例如,假设将下面的 URL 输入到浏览器的地址栏:

https://localhost/Product/Index/3

在这种情况下,将激活名称为 ProductController 的控制器。ProductController 负责响应浏览器请求。例如,控制器可能向浏览器返回特定的视图,或者控制器可能将用户重定向到另一个控制器。

通过向 ASP.NET MVC 应用程序的 Controllers 文件夹添加新的控制器,可以创建新的控制器。右键单击 Controller 文件夹并选择菜单选项 Add,New Item,然后选择 MVC Controller Class 模板,如图 1 所示。控制器名称必须包含后缀 Controller。例如,控制器名称 ProductController 完全符合要求,而 Product 则为无效名称。

 

图 1:创建新的控制器(单击查看大图

如果创建新的名称为 ProductController 的控制器,则将得到如程序清单 1 中的文件。

程序清单 1 ProductController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApp.Controllers
{
     public class ProductController : Controller
     {
          public ActionResult Index()
          {
               // Add action logic here
               throw new NotImplementedException();
          }
     }
}

如程序清单 1 所示,控制器只是一个类(Visual Basic .NET 或 C# 类)。控制器是派生自基础类 System.Web.Mvc.Controller 的类。由于控制器继承自这个基础类,所以控制器自由地继承了许多有用的方法(稍后我们将讨论这些方法)。

了解控制器操作

控制器公开控制器操作。操作是控制器上的方法,在浏览器的地址栏中输入特定 URL 时被调用。例如,假设要请求下面的 URL:

https://localhost/Product/Index/3

在这种情况下,调用 ProductController 类上的 Index() 方法。Index() 方法是控制器操作的一个示例。

控制器操作必须是控制器类的公共方法。默认情况下,C# 方法是私有方法。请注意,任何添加到控制器类的公共方法都自动公开为控制器操作(必须小心对待这个问题,因为任何人都可以简单地通过在浏览器地址栏中键入正确的 URL 激活控制器操作)。

控制器操作还必须满足一些其他要求。用作控制器操作的方法不能重载。更进一步讲,控制器操作不能是静态方法。除此之外,可以将任何方法用作控制器操作。

了解操作结果

控制器操作返回的内容称为操作结果。操作结果是控制器响应浏览器请求而返回的内容。

ASP.NET MVC Framework 支持 6 种标准类型的操作结果:

  1. ViewResult – 代表 HTML 和标记。
  2. EmptyResult – 代表无结果。
  3. RedirectResult – 代表重定向到新的 URL。
  4. RedirectToRouteResult – 代表重定向到新的控制器操作。
  5. JsonResult – 代表可以在 AJAX 应用程序中使用的 JavaScript Object Notation 结果。
  6. ContentResult – 代表文本结果。

所有这些操作结果都继承自基础的 ActionResult 类。

在大多数情况下,控制器操作返回 ViewResult。例如,程序清单 2 中的 Index 控制器操作返回 ViewResult。

程序清单 2 BookController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApp.Controllers
{
     public class BookController : Controller
     {
          public ActionResult Index()
          {
               return View();
          }
     }
}

当操作返回 ViewResult 时,向浏览器返回 HTML。程序清单 2 中的 Index() 方法将名称为 Index.aspx 的视图返回给浏览器。

请注意,程序清单 2 中的 Index() 操作未返回 ViewResult()。而是调用了 Controller 基础类的 View() 方法。通常,不直接返回操作结果。而是调用以下 Controller 基础类的方法之一:

  1. View – 返回 ViewResult 操作结果。
  2. Redirect – 返回 RedirectResult 操作结果。
  3. RedirectToAction – 返回 RedirectToRouteResult 操作结果。
  4. RedirectToRoute – 返回 RedirectToRouteResult 操作结果。
  5. Json – 返回 JsonResult 操作结果。
  6. Content – 返回 ContentResult 操作结果。

所以,如果希望将 View 返回给浏览器,则需要调用 View() 方法。如果希望将用户从一个控制器操作重定向到另一个控制器操作,则需要调用 RedirectToAction() 方法。例如,程序清单 3 中的 Details() 操作显示一个视图或将用户重定向到 Index() 操作,具体取决于 ID 参数是否拥有值。

程序清单 3 CustomerController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApp.Controllers
{
     public class CustomerController : Controller
     {
          public ActionResult Details(int? Id)
          {
               if (Id == null)
                    return RedirectToAction("Index");
               return View();
          }
          public ActionResult Index()
          {
               return View();
          }
     }
}

ContentResult 操作结果比较特殊。可以使用 ContentResult 操作结果返回一个纯文本操作结果。例如,程序清单 4 中的 Index() 方法返回纯文本消息,而不是 HTML 消息。

程序清单 4 StatusController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApp.Controllers
{
     public class StatusController : Controller
     {
          public ContentResult Index()
          {
               return Content("Hello World!");
          }
     }
}

当激活 StatusController.Index() 操作时,不返回视图。而是向浏览器返回原始的文本“Hello World!”。

如果控制器操作返回的结果不是操作结果 – 例如,一个日期或整数 – 那么结果自动封装在 ContentResult 中。例如,程序清单 5 中的 WorkController 的 Index() 操作被激活时,自动将日期作为 ContentResult 返回。

程序清单 5 WorkController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApp.Controllers
{
     public class WorkController : Controller
     {
          public DateTime Index()
          {
               return DateTime.Now;
          }
     }
}

程序清单 5 中的 Index() 操作返回 DateTime 对象。ASP.NET MVC Framework 将 DateTime 对象转换为字符串,并将 DateTime 值自动封装在 ContentResult 中。浏览器检索纯文本日期和时间。

总结

本教程的目的是向读者介绍 ASP.NET MVC 控制器、控制器操作和控制器操作结果的概念。在第一部分中,我们学习了如何向 ASP.NET MVC 项目添加新控制器。接下来,我们学习了如何将控制器的公共方法作为控制器操作公开。最后,我们讨论了可以从控制器操作返回的不同类型的操作结果。我们还专门讨论了如何从控制器操作返回 ViewResult、RedirectToActionResult 和 ContentResult。





下一篇教程