1. 컨트롤러 이해
MVC 컨트롤러는 ASP.NET MVC 웹 사이트에 시작된 요청에 응답하는 역할을 담당합니다. 모든 브라우저 요청은 전용 컨트롤러에 매핑됩니다. 예를 들어 브라우저 주소 표시줄에 다음 URL을 입력한다고 가정해 보겠습니다.
localhost/product/index/3
이 경우 ProductController라는 컨트롤러가 호출됩니다. ProductController는 브라우저 요청에 대한 응답을 생성하는 역할을 담당합니다. 예를 들어 컨트롤러는 특정 뷰를 반환하거나 사용자를 다른 컨트롤러로 리디렉션할 수 있습니다.
ASP.NET MVC 애플리케이션의 Controllers 폴더 아래에 새 컨트롤러를 추가하여 새 컨트롤러를 만들 수 있습니다. 컨트롤러 폴더를 마우스 오른쪽 버튼으로 클릭하고 "추가", "새로 만들기" 메뉴 항목을 선택한 다음 "MVC 컨트롤러 클래스"를 선택합니다( 그림 1 참조). 컨트롤러 이름에는 접미사 Controller가 포함되어야 합니다. 예를 들어 컨트롤러 이름 ProductController는 괜찮지만 컨트롤러 Product가 작동하지 않습니다.
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 기본 클래스에서 를 상속하는 클래스입니다. 컨트롤러는 이 기본 클래스에서 상속되기 때문에 컨트롤러는 몇 가지 유용한 메서드를 쉽게 상속합니다(이에 대해서는 곧 설명하겠습니다).
2. 컨트롤러 액션 이해
컨트롤러는 컨트롤러 액션을 노출합니다. 액션은 브라우저 주소 표시줄에 특정 URL을 입력할 때 호출되는 컨트롤러의 메서드입니다. 예를 들어, 다음 URL에 요청한다고 가정해 보겠습니다.
localhost/Product/Index/3
이 경우 ProductController 클래스에서 Index() 메서드가 호출됩니다. Index() 메서드는 컨트롤러 작업의 예입니다.
컨트롤러 작업은 컨트롤러 클래스의 공개 메서드여야 합니다. C# 메서드는 기본적으로 프라이빗 메서드입니다. 컨트롤러 클래스에 추가하는 모든 공용 메서드는 자동으로 컨트롤러 작업으로 노출된다는 점을 인식하세요. 올바른 URL을 입력하기만 하면 전 세계 누구나 컨트롤러 작업을 호출할 수 있으므로 매우 주의해야 합니다.
컨트롤러 작업도 몇 가지 추가 요구 사항을 충족해야 합니다. 컨트롤러 작업으로 사용되는 메서드는 오버로드될 수 없습니다. 또한 컨트롤러 작업은 정적 메서드일 수 없습니다. 이 외에도 컨트롤러 작업으로 모든 메서드를 사용할 수 있습니다.
3. 컨트롤러 결과 이해
컨트롤러 액션은 Action Result라는 것을 반환합니다. 작업 결과는 컨트롤러 작업이 요청에 대해 브라우저에 반환하는 것입니다.
ASP.NET MVC 프레임워크는 6가지 표준 유형의 작업 결과를 지원합니다.
ViewResult – HTML 및 마크업을 나타냅니다.
EmptyResult – 결과가 없음을 나타냅니다.
RedirectResult – 새 URL로의 리디렉션을 나타냅니다.
RedirectToRouteResult – 새 컨트롤러 작업으로의 리디렉션을 나타냅니다.
JsonResult – AJAX 애플리케이션에서 사용할 수 있는 JSON(Javascript Object Notation) 결과를 나타냅니다.
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 기본 클래스의 다음 메서드 중 하나를 호출하세요.
View - ViewResult 결과를 반환합니다.
Redirect – RedirectResult 작업 결과를 반환합니다.
RedirectToAction – RedirectToAction 작업 결과를 반환합니다.
RedirectToRoute – RedirectToRoute 작업 결과를 반환합니다.
Json – JsonResult 작업 결과를 반환합니다.
Content – 返回一个ContentResult动作结果。
因此,如果你想向浏览器返回一个视图,你可以调用View()方法。如果你想要降用户从一个控制器动作重定向到另一个,你可以调用RedirectToAction()方法。举个例子,代码清单3中的Details()动作要么显示一个视图,要么将用户重定向到Index()动作,取决于Id参数是否含有值。
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 – WorkerController.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框架自动将DateTime对象转换为一个字符串,并且将DateTime值包装在一个ContentResult中。浏览器将会以纯文本的方式收到日期和时间。
4. 总结
这篇教程的目的是为你介绍ASP.NET MVC中控制器、控制器动作以及控制器动作结果的概念。在第一部分,你学习了如何向ASP.NET MVC项目中添加新的控制器。接下来,你学习了控制器的公共方法是如何作为控制器动作暴露给全世界的。最后,我们讨论了动作结果的各种不同类型,这些动作结果可以从控制器动作中返回。特别地,我们讨论了如何从控制器动作中返回一个ViewResult、RedirectToActionResult和ContentResult。
5. 创建控制器
这篇教程的目的是解释如何来创建新的ASP.NET MVC控制器。你会学习如何通过Visual Studio Add Controller菜单和手工创建类文件,来创建控制器。
5.1 使用Add Controler菜单选项
创建一个新控制的最简单方法是在Visual Studio的解决方案浏览器的Controllers文件夹上点击右键,并且选择Add,Controller菜单项(如图1)。选择这个菜单项打开了Add Controller对话框(如图2)。
图2:添加一个新的控制器
注意到控制器名称的第一部分在Add Controller对话框中高亮显示了。每一个控制器的名称必须以Controller后缀结尾。举个例子,你可以创建一个叫做ProductController的控制器,但是不能创建一个叫做Product的控制器。
NOTE:如果你创建一个控制器,它不含有Controller后缀,那么你将无法调用这个控制器。不要这么做 -- 在犯了这个错误之后,我已经浪费了不计其数的时间。
代码清单1 - Controller/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: /Product/ public ActionResult Index() { return View(); } } }
你应该总是在Controllers文件夹中创建控制器。否则的话,就破坏了ASP.NET MVC的惯例,其他的程序员将会花费更多艰辛的时间来理解你的应用程序。
5.2 创建动作方法
当你创建一个控制器时,你可以选择自动生成Create,Update和Details动作方法(如图3)。如果你选择了这个选项,那么会生成代码2中的控制器类。
代码清单2 - Controllers\CustomerController.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 CustomerController : Controller { // // GET: /Customer/ public ActionResult Index() { return View(); } // // GET: /Customer/Details/5 public ActionResult Details(int id) { return View(); } // // GET: /Customer/Create public ActionResult Create() { return View(); } // // POST: /Customer/Create [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(FormCollection collection) { try { // TODO: Add insert logic here return RedirectToAction("Index"); } catch { return View(); } } // // GET: /Customer/Edit/5 public ActionResult Edit(int id) { return View(); } // // POST: /Customer/Edit/5 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(int id, FormCollection collection) { try { // TODO: Add update logic here return RedirectToAction("Index"); } catch { return View(); } } } }
这些生成的方法都只是一些存根方法(stub methods)。你必须自己为客户的创建、更新和显示详情添加实际的逻辑。但是,这些存根方法为你提供了一个漂亮的着手点。
5.3 创建一个控制器类
ASP.NET MVC控制器不过是一个类。如果你喜欢,可以无视Visual Studio便利的控制器创建方式,自己手动来创建一个控制器类。按照这些步骤:
右键点击Controllers文件夹,并且选择菜单项Add,New Item,然后选择Class模板。
将新类命名为PersonController.cs,然后点击Add按钮。
修改产生的类文件,让这个类继承自System.Web.Mvc.Controller基类(见代码清单3)。
代码清单3 - Controllers\PersonController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcApplication1.Controllers { public class PersonController : System.Web.Mvc.Controller { public string Index() { return "Hello World!"; } } }
代码清单3中的控制器类公布了一个叫做Index()的动作,它返回字符串“Hello World!”。你可以通过运行应用程序,并且请求像下面这样的URL来调用这个控制器动作:
localhost:40071/Person
NOTE:ASP.NET 开发服务器使用一个随机的端口号(例如,40071)。当输入URL来调用控制器时,你需要提供正确的端口号。你可以通过将鼠标悬停在ASP.NET开发服务器的图标上来获得端口号,该图标位于Windows Notification Area(Windows通知区域,屏幕的右下角)。
6. 创建自定义动作
本篇教程的目的是解释如何创建一个新的控制器动作。你会学习到控制器动作的要求。你还会学习如何来阻止将方法公布为控制器动作。
6.1 添加动作到控制器
你可以通过在控制器中添加一个新的方法,将新的动作添加到控制器中。举个例子,代码清单1中的控制器包含了一个叫做Index()和一个叫做SayHello()的动作。这两个方法都公布为了动作。
代码清单1 - Controllers\HomeController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApplication1.Controllers { [HandleError] public class HomeController : Controller { public ActionResult Index() { return View(); } public string SayHello() { return "Hello!"; } } }
为了将方法作为一个动作公布给全世界,方法必须满足特定的要求:
方法必须是公共的。
方法不能是静态方法。
方法不能使扩展方法。
方法不能是构造函数,访问器,或者设置器。
方法不能拥有开放泛型类型(open generic types)。
方法不能使控制器基类中的方法。
方法不能含有ref或者out参数。
6.2 阻止公共方法被调用
如果你需要在控制器中创建一个公共方法,但是你不想将这个方法发布为控制器动作,那么你可以通过使用[NonAction]特性来阻止该方法被外界调用。举个例子,代码清单2中的控制器含有一个叫做CompanySecrets()的公共方法,它使用[NonAction]特性进行了修饰。
代码清单2 - Controller\WorkController.cs
using System.Web.Mvc; namespace MvcApplication1.Controllers { public class WorkController : Controller { [NonAction] public string CompanySecrets() { return "This information is secret."; } } }
如果你试图通过在浏览器地址栏输入/Work/CompanySecrets来调用CompanySecrets()控制器动作,那么你会获得图5所示的错误消息:
【相关推荐】
1. 什么是ASP.NET MVC ?总结ASP.NET MVC
5. 通过asp.net mvc开发微信自定义菜单编辑工具的代码示例
위 내용은 ASP.NET MVC-컨트롤러에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!