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

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

在本教程中,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.vb

Public Class ProductController
     Inherits System.Web.Mvc.Controller
     Function Index()
          ' Add action logic here
          Throw New NotImplementedException()
     End Function
End Class

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

了解控制器操作

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

https://localhost/Product/Index/3

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

控制器操作必须是控制器类的公共方法。默认情况下,Visual Basic .NET 函数是公共函数。这就意味着,默认情况下,任何添加到控制器类的公共函数都自动公开为控制器操作(必须小心对待这个问题,因为任何人都可以简单地通过在浏览器地址栏键入正确的 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.vb

Public Class BookController
     Inherits System.Web.Mvc.Controller
     Function Index()
          Return View()
     End Function
End Class

当操作返回 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.vb

Public Class CustomerController
     Inherits System.Web.Mvc.Controller
     Function Details(ByVal Id As Integer?)
          If IsNothing(Id) Then
               Return RedirectToAction("Index")
          End If
          Return View()
     End Function
     Function Index()
          Return View()
     End Function
End Class

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

程序清单 4 StatusController.vb

Public Class StatusController
     Inherits System.Web.Mvc.Controller
     Function Index()
          Return Content("Hello World!")
     End Function
End Class

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

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

程序清单 5 WorkController.vb

Public Class WorkController
     Inherits System.Web.Mvc.Controller
     Function Index() As DateTime
          Return DateTime.Now
     End Function
End Class

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

总结

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





下一篇教程