詳細介紹ASP.NET MVC--控制器(controller)

零下一度
發布: 2017-05-20 13:33:49
原創
8892 人瀏覽過

1.瞭解控制器

MVC控制器負責回應對ASP.NET MVC網站發起的請求。每一個瀏覽器請求都映射到了一個專門的控制器。舉個例子,設想一下你在瀏覽器網址列輸入了下面的URL:

localhost/product/index/3
登入後複製

在這種情況下,將會呼叫一個名為ProductController的控制器。 ProductController負責產生對瀏覽器請求的回應。舉個例子,控制器可能會傳回一個特定的視圖,或是將使用者重新導向到另一個控制器。

你可以透過在ASP.NET MVC應用程式的Controllers資料夾下新增一個新的控制器來建立一個新控制器。右鍵點擊控制器的資料夾,並且選擇選單項目“Add(新增)”,“New(新建項目)”,並選擇“MVC Controller Class(MVC控制器類別)”(見圖1 )。控制器的名字必須含有Controller後綴。舉個例子,控制器名稱ProductController沒什麼問題,但控制器Product就不行。

詳細介紹ASP.NET MVC--控制器(controller)

如果你建立一個新的名為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
登入後複製

在本例中,Index()方法在ProductController類別上被呼叫。 Index()方法是控制器動作的一個例子。

一個控制器動作必須是控制器類別的一個公共方法。 C#方法,預設時,是私有方法。意識到你添加到控制器類別中的任何公共方法都會自動被暴露為控制器動作(你必須非常小心,因為控制器動作可以被全球的任何人調用,僅僅簡單地通過在瀏覽器地址欄輸入正確的URL)。

控制器動作還要滿足一些額外的需求。作為控制器動作來使用的方法不能夠重載。另外,控制器動作不能為靜態方法。除了這些以外,你可以將任何方法當作控制器動作來使用。

3. 瞭解控制器結果

控制器動作傳回一種叫做動作結果(Action Result)的東西。動作結果是控制器動作回傳給瀏覽器請求的東西。

ASP.NET MVC框架支援六種標準類型的動作結果:

ViewResult – 代表HTML及標記。

EmptyResult – 代表無結果。

RedirectResult – 代表重定向到一個新的URL。

RedirectToRouteResult – 代表重定向到一個新的控制器動作。

JsonResult – 代表一個JSON(Javascript Object Notation)結果,它可以用於AJAX應用程式。

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)。

詳細介紹ASP.NET MVC--控制器(controller)

图2:添加一个新的控制器

詳細介紹ASP.NET MVC--控制器(controller)

注意到控制器名称的第一部分在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中的控制器类。


詳細介紹ASP.NET MVC--控制器(controller)

代码清单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)。

詳細介紹ASP.NET MVC--控制器(controller)

代码清单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所示的错误消息:

詳細介紹ASP.NET MVC--控制器(controller)

【相关推荐】

1. 什么是ASP.NET MVC ?总结ASP.NET MVC

2. 深入了解ASP.NET MVC与WebForm的区别

3. 详细介绍ASP.NET MVC--视图

4. 详细介绍ASP.NET MVC--路由

5. 通过asp.net mvc开发微信自定义菜单编辑工具的代码示例

以上是詳細介紹ASP.NET MVC--控制器(controller)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板