1. コントローラー
MVC を理解する コントローラーは、ASP.NETMVC Web サイトに対して開始されたリクエストに応答する責任があります。すべてのブラウザー要求は専用コントローラーにマップされます。たとえば、ブラウザのアドレス バーに次の URL を入力するとします。
localhost/product/index/3
この場合、ProductController という名前のコントローラーが呼び出されます。 ProductController は、ブラウザー要求に対する応答を生成する役割を果たします。たとえば、コントローラーは特定の view を返したり、ユーザーを別のコントローラーにリダイレクトしたりする場合があります。
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#class) です。コントローラーは、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 中国語 Web サイトの他の関連記事を参照してください。