[翻译:ASP.NET MVC 教程]ASP.NET MVC控制器概览
本教程涉及了ASP.NET MVC控制器、控制器动作以及动作结果的话题。在你读完本教程后,你将理解控制器是怎样被用来控制访问者与ASP.NET MVC站点交互的方法的。
理解控制器
MVC控制器负责回应对ASP.NET MVC站点的请求。每个浏览器请求都被映射至一个特定的控制器。例如,设想你键入了下列URL到你的浏览器地址栏中:
http://localhost/Product/Index/3
在这种情况下,一个名为ProductController的控制器就被请求了。ProductController负责生成给浏览器的回应。例如,控制器也许会返回一个特定的视图至浏览器,抑或是将用户重新导向至另一个控制器。
清单1包含了一个简单的名为ProductController的控制器。
清单1——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)。
这里有一些控制器动作必须满足的附加要求。作为控制器动作被使用的方法是不能重载的。此外,控制器动作不能是一个静态的方法。除那之外,你可以使用任何方法作为控制器动作。
理解控制器结果
控制器动作所返回的内容称之为action result(控制器结果)。控制器结果是控制器回应给浏览器的内容。
ASP.NET MVC 框架支持下列几种类型的控制器结果:
- ViewResult – 代表HTML和标签。
- EmptyResult – 代表结果为空。
- RedirectResult – 代表重新导向一个新的URL。
- JsonResult – 代表可被用于AJAX应用程序的JavaScript Object Notation结果。
- JavaScriptResult – 代表JavaScript脚本。
- ContentResult – 代表文本结果。
- FileContentResult – 代表可下载的文件(以二进制内容形式)。
- FilePathResult –代表可下载的文件(以文件路径形式)。
- FileStreamResult –代表可下载的文件(以文件流形式)。
以上这些动作结果均继承自ActionResult类。
在多数情况下,一个控制器动作返回ViewResult。例如,在清单2中的Index控制器动作返回了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()。作为替代,控制器基类的View()方法被调用。正常情况下,你无需直接返回控制器结果。作为替代,你调用了下列控制器基类方法之一:
- View – 返回ViewResult动作结果。
- Redirect – 返回RedirectResult动作结果。
- RedirectToAction – 返回RedirectToRouteResult动作结果。
- RedirectToRoute – 返回RedirectToRouteResult动作结果。
- Json – 返回JsonResult动作结果。
- JavaScriptResult – 返回JavaScriptResult。
- Content – 返回ContentResult动作结果。
- File – 返回FileContentResult, FilePathResult,或FileStreamResult,取决于传送至该方法的参数。
因此,如果你想要返回View至浏览器,你就调用View()方法。如果你想要将用户从一个控制器动作导向至另一个,你就调用RedirectToAction()方法。例如,清单3中的Details()动作取决于Id参数的值是否存在来显示视图或者将用户重新导向至Index()动作。
清单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。
文章出处:Kinglee’s Blog (http://www.cnblogs.com/Kinglee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。