1. Comprendre le contrôleur
MVC Le contrôleur est chargé de répondre aux requêtes initiées sur le site Web ASP.NET MVC. Chaque requête du navigateur est mappée à un contrôleur dédié. Par exemple, imaginez que vous saisissiez l'URL suivante dans la barre d'adresse du navigateur :
localhost/product/index/3
Dans ce cas, un contrôleur nommé ProductController sera appelé. ProductController est chargé de générer des réponses aux requêtes du navigateur. Par exemple, un contrôleur peut renvoyer une vue spécifique ou rediriger l'utilisateur vers un autre contrôleur.
Vous pouvez créer un nouveau contrôleur en ajoutant un nouveau contrôleur dans le dossier Controllers de votre application ASP.NET MVC. Cliquez avec le bouton droit sur le dossier du contrôleur et sélectionnez les éléments de menu "Ajouter", "Nouveau", puis sélectionnez "Classe de contrôleur MVC" (voir Figure 1). Le nom du contrôleur doit contenir le suffixe Contrôleur. Par exemple, le nom du contrôleur ProductController convient, mais le contrôleur Product ne fonctionne pas.
Si vous créez un nouveau contrôleur nommé ProductController, vous obtiendrez le fichier affiché dans le listing 1.
Liste de codes 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(); } } }
Comme vous pouvez le voir dans la liste de codes 1, un contrôleur n'est qu'une classe (Visual Basic.Net ou C# classe). Un contrôleur est une classe qui hérite de la classe de base System.Web.Mvc.Controller. Étant donné que le contrôleur hérite de cette classe de base, il hérite facilement de certaines méthodes utiles (dont nous parlerons sous peu).
2. Comprendre les actions du contrôleur
Les contrôleurs exposent les actions du contrôleur. Une action est une méthode du contrôleur qui sera appelée lorsque vous saisirez une URL spécifique dans la barre d'adresse du navigateur. Par exemple, supposons que vous fassiez une requête à l'URL suivante :
localhost/Product/Index/3
Dans ce cas, la méthode Index() est appelée sur la classe ProductController. La méthode Index() est un exemple d'action de contrôleur.
Une action de contrôleur doit être une méthode publique de la classe du contrôleur. Les méthodes C#, par défaut, sont des méthodes privées. Sachez que toute méthode publique que vous ajoutez à votre classe de contrôleur sera automatiquement exposée en tant qu'action de contrôleur (vous devez être très prudent car les actions de contrôleur peuvent être appelées par n'importe qui dans le monde en tapant simplement l'URL correcte).
Les actions du contrôleur doivent également répondre à certaines exigences supplémentaires. Les méthodes utilisées comme actions de contrôleur ne peuvent pas être surchargées. De plus, les actions du contrôleur ne peuvent pas être des méthodes statiques. En dehors de cela, vous pouvez utiliser n’importe quelle méthode comme action du contrôleur.
3. Comprendre les résultats du contrôleur
Les actions du contrôleur renvoient quelque chose appelé Résultat de l'action. Le résultat de l'action est ce que l'action du contrôleur renvoie au navigateur pour la requête.
Le framework ASP.NET MVC prend en charge six types standard de résultats d'action :
ViewResult – représente le HTML et le balisage.
EmptyResult – ne représente aucun résultat.
RedirectResult – Représente une redirection vers une nouvelle URL.
RedirectToRouteResult – Représente une redirection vers une nouvelle action du contrôleur.
JsonResult – Représente un résultat JSON (Javascript Object Notation), qui peut être utilisé dans les applications AJAX.
ContentResult – représente le résultat du texte.
Tous ces résultats d'action héritent de la classe de base ActionResult.
Dans la plupart des cas, le contrôleur agit ViewResult. Par exemple, l'action du contrôleur Index() dans le listing 2 renvoie un ViewResult.
Liste de codes 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(); } } }
Lorsqu'une action renvoie un ViewResult, le HTML sera renvoyé au navigateur. La méthode Index() du listing 2 renvoie une vue nommée Index.aspx au navigateur.
Notez que l'action Index() dans le listing 2 ne remet pas de ViewResult(). Au lieu de cela, la méthode View() de la classe de base Controller est appelée. Normalement, vous ne renvoyez pas directement le résultat d’une action. Au lieu de cela, appelez l'une des méthodes suivantes de la classe de base Controller :
View – Renvoie un résultat ViewResult.
Redirect – Renvoie le résultat d’une action RedirectResult.
RedirectToAction – Renvoie un résultat d’action RedirectToAction.
RedirectToRoute – Renvoie le résultat d’une action RedirectToRoute.
Json – Renvoie un résultat d'action 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开发微信自定义菜单编辑工具的代码示例
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!