溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET MVC中控制器的示例分析

發(fā)布時間:2021-09-15 18:45:41 來源:億速云 閱讀:96 作者:小新 欄目:編程語言

這篇文章主要介紹了ASP.NET MVC中控制器的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1.理解控制器

MVC控制器負(fù)責(zé)響應(yīng)對ASP.NET MVC網(wǎng)站發(fā)起的請求。每一個瀏覽器請求都映射到了一個專門的控制器。舉個例子,設(shè)想一下你在瀏覽器地址欄輸入了下面的URL:

localhost/product/index/3

在這種情況下,將會調(diào)用一個名為ProductController的控制器。ProductController負(fù)責(zé)生成對瀏覽器請求的響應(yīng)。舉個例子,控制器可能會返回一個特定的視圖,或者是將用戶重定向到另一個控制器。

你可以通過在ASP.NET MVC應(yīng)用程序的Controllers文件夾下添加一個新的控制器來創(chuàng)建一個新控制器。右鍵點(diǎn)擊控制器的文件夾,并且選擇菜單項(xiàng)“Add(添加)”,“New(新建項(xiàng))”,并選擇“MVC Controller Class(MVC控制器類)”(見圖1)。控制器的名字必須含有Controller后綴。舉個例子,控制器名稱ProductController沒什么問題,但是控制器Product就不起作用。

ASP.NET MVC中控制器的示例分析

如果你創(chuàng)建一個新的名為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基類的類。因?yàn)榭刂破骼^承自這個基類,所以控制器輕松地繼承了一些有用的方法(我們不久將會討論這些方法)。

2. 理解控制器動作

控制器暴露出控制器動作。動作是控制器的一個方法,當(dāng)你在瀏覽器地址欄輸入某一特定的URL時,將會調(diào)用這個方法。舉個例子,假設(shè)你對下面這個URL發(fā)出請求:

localhost/Product/Index/3

在本例中,Index()方法在ProductController類上被調(diào)用。Index()方法是控制器動作的一個例子。

一個控制器動作必須是控制器類的一個公共方法。C#方法,默認(rèn)時,是私有方法。意識到你添加到控制器類中的任何公共方法都會自動被暴露為控制器動作(你必須非常小心,因?yàn)榭刂破鲃幼骺梢员蝗虻娜魏稳苏{(diào)用,僅僅簡單地通過在瀏覽器地址欄輸入正確的URL)。

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

3. 理解控制器結(jié)果

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

ASP.NET MVC框架支持六種標(biāo)準(zhǔn)類型的動作結(jié)果:

ViewResult – 代表HTML及標(biāo)記。

EmptyResult – 代表無結(jié)果。

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

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

JsonResult – 代表一個JSON(Javascript Object Notation)結(jié)果,它可以用于AJAX應(yīng)用程序。

ContentResult – 代表著文本結(jié)果。

所有這些動作結(jié)果都繼承自ActionResult基類。

在大多數(shù)情況下,控制器動作 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();
          }
     }
}

當(dāng)一個動作返回一個ViewResult,將會向?yàn)g覽器返回HTML。代碼清單2中的Index()方法向?yàn)g覽器返回了一個名為Index.aspx的視圖。

注意到代碼清單2中的Index()動作并沒有放回一個ViewResult()。而是調(diào)用了Controller基類的View()方法。通常情況下,你并不直接返回一個動作結(jié)果。而是調(diào)用Controller基類的下列方法之一:

View – 返回一個ViewResult結(jié)果。

Redirect – 返回一個RedirectResult 動作結(jié)果。

RedirectToAction – 返回一個RedirectToAction動作結(jié)果。

RedirectToRoute – 返回一個RedirectToRoute動作結(jié)果。

Json – 返回一個JsonResult動作結(jié)果。

Content – 返回一個ContentResult動作結(jié)果。

因此,如果你想向?yàn)g覽器返回一個視圖,你可以調(diào)用View()方法。如果你想要降用戶從一個控制器動作重定向到另一個,你可以調(diào)用RedirectToAction()方法。舉個例子,代碼清單3中的Details()動作要么顯示一個視圖,要么將用戶重定向到Index()動作,取決于Id參數(shù)是否含有值。

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動作結(jié)果很特別。你可以使用ContentResult動作結(jié)果來將動作結(jié)果作為純文本返回。舉個例子,代碼清單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!");
          }
     }
}

當(dāng)調(diào)用StatusController.Index()動作時,并沒有返回一個視圖。而是向?yàn)g覽器返回了原始的文本“Hello World!”。

如果一個控制器動作返回了一個結(jié)果,而這個結(jié)果并非一個動作結(jié)果 – 例如,一個日期或者整數(shù) – 那么結(jié)果將自動被包裝在ContentResult中。舉個例子,當(dāng)調(diào)用代碼清單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對象轉(zhuǎn)換為一個字符串,并且將DateTime值包裝在一個ContentResult中。瀏覽器將會以純文本的方式收到日期和時間。

4. 總結(jié)

這篇教程的目的是為你介紹ASP.NET MVC中控制器、控制器動作以及控制器動作結(jié)果的概念。在第一部分,你學(xué)習(xí)了如何向ASP.NET MVC項(xiàng)目中添加新的控制器。接下來,你學(xué)習(xí)了控制器的公共方法是如何作為控制器動作暴露給全世界的。最后,我們討論了動作結(jié)果的各種不同類型,這些動作結(jié)果可以從控制器動作中返回。特別地,我們討論了如何從控制器動作中返回一個ViewResult、RedirectToActionResult和ContentResult。

5. 創(chuàng)建控制器

這篇教程的目的是解釋如何來創(chuàng)建新的ASP.NET MVC控制器。你會學(xué)習(xí)如何通過Visual Studio Add Controller菜單和手工創(chuàng)建類文件,來創(chuàng)建控制器。

5.1 使用Add Controler菜單選項(xiàng)

創(chuàng)建一個新控制的最簡單方法是在Visual Studio的解決方案瀏覽器的Controllers文件夾上點(diǎn)擊右鍵,并且選擇Add,Controller菜單項(xiàng)(如圖1)。選擇這個菜單項(xiàng)打開了Add Controller對話框(如圖2)。

ASP.NET MVC中控制器的示例分析

圖2:添加一個新的控制器

ASP.NET MVC中控制器的示例分析

注意到控制器名稱的第一部分在Add Controller對話框中高亮顯示了。每一個控制器的名稱必須以Controller后綴結(jié)尾。舉個例子,你可以創(chuàng)建一個叫做ProductController的控制器,但是不能創(chuàng)建一個叫做Product的控制器。

NOTE:如果你創(chuàng)建一個控制器,它不含有Controller后綴,那么你將無法調(diào)用這個控制器。不要這么做 -- 在犯了這個錯誤之后,我已經(jīng)浪費(fèi)了不計其數(shù)的時間。

代碼清單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();
        }
    }
}

你應(yīng)該總是在Controllers文件夾中創(chuàng)建控制器。否則的話,就破壞了ASP.NET MVC的慣例,其他的程序員將會花費(fèi)更多艱辛的時間來理解你的應(yīng)用程序。

5.2 創(chuàng)建動作方法

當(dāng)你創(chuàng)建一個控制器時,你可以選擇自動生成Create,Update和Details動作方法(如圖3)。如果你選擇了這個選項(xiàng),那么會生成代碼2中的控制器類。


ASP.NET MVC中控制器的示例分析

代碼清單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)。你必須自己為客戶的創(chuàng)建、更新和顯示詳情添加實(shí)際的邏輯。但是,這些存根方法為你提供了一個漂亮的著手點(diǎn)。

5.3 創(chuàng)建一個控制器類

ASP.NET MVC控制器不過是一個類。如果你喜歡,可以無視Visual Studio便利的控制器創(chuàng)建方式,自己手動來創(chuàng)建一個控制器類。按照這些步驟:

右鍵點(diǎn)擊Controllers文件夾,并且選擇菜單項(xiàng)Add,New Item,然后選擇Class模板。

將新類命名為PersonController.cs,然后點(diǎn)擊Add按鈕。

修改產(chǎn)生的類文件,讓這個類繼承自System.Web.Mvc.Controller基類(見代碼清單3)。

ASP.NET MVC中控制器的示例分析

代碼清單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!”。你可以通過運(yùn)行應(yīng)用程序,并且請求像下面這樣的URL來調(diào)用這個控制器動作:

localhost:40071/Person

NOTE:ASP.NET 開發(fā)服務(wù)器使用一個隨機(jī)的端口號(例如,40071)。當(dāng)輸入URL來調(diào)用控制器時,你需要提供正確的端口號。你可以通過將鼠標(biāo)懸停在ASP.NET開發(fā)服務(wù)器的圖標(biāo)上來獲得端口號,該圖標(biāo)位于Windows Notification Area(Windows通知區(qū)域,屏幕的右下角)。

6. 創(chuàng)建自定義動作

本篇教程的目的是解釋如何創(chuàng)建一個新的控制器動作。你會學(xué)習(xí)到控制器動作的要求。你還會學(xué)習(xí)如何來阻止將方法公布為控制器動作。

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!";
        }
    
    }
}

為了將方法作為一個動作公布給全世界,方法必須滿足特定的要求:

方法必須是公共的。

方法不能是靜態(tài)方法。

方法不能使擴(kuò)展方法。

方法不能是構(gòu)造函數(shù),訪問器,或者設(shè)置器。

方法不能擁有開放泛型類型(open generic types)。

方法不能使控制器基類中的方法。

方法不能含有ref或者out參數(shù)。

6.2 阻止公共方法被調(diào)用

如果你需要在控制器中創(chuàng)建一個公共方法,但是你不想將這個方法發(fā)布為控制器動作,那么你可以通過使用[NonAction]特性來阻止該方法被外界調(diào)用。舉個例子,代碼清單2中的控制器含有一個叫做CompanySecrets()的公共方法,它使用[NonAction]特性進(jìn)行了修飾。

代碼清單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來調(diào)用CompanySecrets()控制器動作,那么你會獲得圖5所示的錯誤消息:

ASP.NET MVC中控制器的示例分析

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“ASP.NET MVC中控制器的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI