ASP.NET MVC 音樂市集 – 2.控制器

來源:互聯網
上載者:User
MusicStore 項目的完整配套視頻!

在典型的 Web 應用程式中,使用者請求的 URL 地址通常映射到儲存在網站中的檔案上,例如,當使用者請求 /Products.aspx 的時候,或者 /Products.php 的時候,很可能是在通過處理 Products.aspx 或者 Products.php 檔案來完成任務。

ASP.NET MVC 的處理方式則不同,它沒有映射到檔案上,相反,將這些 URL 地址映射到類的方法上,這些類被稱為“控制器”,控制器用來接受 HTTP 要求,處理使用者的輸入,擷取或者儲存資料,其中的處理方法稱為 Action,然後將回應發送到用戶端,可能是顯示了一個 HTML 的網頁,下載一個檔案,重新導向到另外一個地址等等。

預設的路由配置

在新建立的項目中,開啟 Global.asax.cs 檔案,可以看到如下的代碼。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcMusicStore
{
// 注意: 有關啟用 IIS6 或 IIS7 傳統模式的說明,
// 請訪問 http://go.microsoft.com/?LinkId=9394801

public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default", // 路由名稱
"{controller}/{action}/{id}", // 帶有參數的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數預設值
);


}

// 一般用來進行網站的初始化
protected void Application_Start()
{
System.Data.Entity.Database.SetInitializer(new MvcMusicStore.Models.SampleData());

AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
}

 

其中 RegisterRoutes 方法註冊了預設的路由配置,在方法中的 routes.MapRoute 語句中,請求地址將會被看成三個部分組成,{controller}/{action}/{id},第一部分稱為控制器,如果沒有提供的話,預設為 Home, 第二部分稱為  Action 方法,如果沒有提供的話,預設為 Index, 第三部分稱為 id, 通常用來提供資料的標識,沒有預設值。這樣,當請求 / 地址的時候,系統將會把請求映射到名為 Home 的控制器進行處理,調用其中名為 Index 的方法處理請求。

增加 HomeController

我們的市集從增加一個首頁的控制器開始,使用預設的命名規範,控制器的名稱應該以 Controller 作為尾碼,我們將這個控制器命名為 HomeController。

在 Controller 檔案夾上右擊,然後選擇“添加”,“控制器(T)…”

 

在彈出的對話方塊中,輸入控制器的名字 HomeController,按下“添加”按鈕。

這樣,將會建立一個名為 HomeController.cs 的檔案,其中的代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcMusinStore.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/

public ActionResult Index()
{
return View();
}

}
}

為了儘可能地簡單,我們讓 Index 方法簡單地返回一個字串,這個字串將作為回應內容直接返回瀏覽器,我們做下面的兩個簡單修改。

  •  將方法的傳回型別修改為string
  •  將返回語句修改為 return "Hello form Home";

這樣,我們的方法將會變成如下的內容

public string Index()
{
return "Hello form Home";
}



運行程式

現在,可以運行一下了,我們可以啟動伺服器,使用下面的任何一種方法都可以。

  •   選擇“調試”,“啟動調試”菜單
  •   點擊工具列上的綠色的箭頭按鈕
  •   使用鍵盤快速鍵,F5

 

使用上面的任何一種方法都會導致編譯項目,啟動 Visual Studio 中內建的 ASP.NET 程式開發伺服器.

在螢幕的右下角會彈出一個啟動 ASP.NET 程式開發伺服器的提示,

Visual Studio 將自動開啟一個瀏覽器視窗,其中的地址指向我們的 Web 服務器,這使得我們可以快速使用我們的程式。

Ok, 非常的簡單,我們已經建立了一個 Web 網站,寫了一個三行的函數,在瀏覽器中得到了這行文字, 不是很震撼,但這僅僅只是開始。

增加 StoreController

我們已經為網站增加一個簡單的 HomeController 作為首頁,現在,增加另外一個控制器,可以用來瀏覽我們的音樂市集,我們的商店控制器將要支援三個情境:

  •  列出商店中的唱片的分類
  •  瀏覽商店中某個分類中的唱片列表
  •  顯示特定唱片的詳細資料

我們從增加一個新的 StoreController 開始,先停止剛才的程式,可以直接關閉瀏覽器,或者也可以在調試菜單中,選擇停止調試。

現在,增加一個新的 StoreController,像在 HomeController 中做的一樣,我們在 Controllers 檔案夾上右健,選擇“添加”,“控制器”.

新的 StoreController 控制器中已經包含了 Index 方法,我們使用這個方法來實現列出所有分類的列表,我們還會再增加兩個額外的方法來實現其他的情境:瀏覽和明細。

這些包含在控制器中的方法,我們稱為控制器中的 Action,像你在前面看到的,HomeController 中的 Index 方法就是一個 Action,這些 Action 的作用就是處理請求,然後返回對請求的處理結果。

對於我們的 StoreController ,首先讓 Index 這個 Action 返回一個“Hello” 串,然後,增加兩個方法:Browse() 和 Detials()

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcMusinStore.Controllers
{
public class StoreController : Controller
{
//
// GET: /Store/

public string Index()
{
return "Hello from Store.Index()";
}

public string Browse()
{
return "Hello from Store.Browse()";
}

public string Details()
{
return "Hello from Store.Details()";
}

}
}

重新運行程式,現在已經可以訪問這些地址了。

  •   /Store
  •   /Store/Browse
  •   /Store/Details

太棒了,但是現在僅僅能夠返回一些常量的字串,讓我們將它們變成動態,我們從 URL 中擷取一些資訊,然後把他們顯示在返回的頁面中。

首先,修改我們的 Browse 這個 Action,使得它可以從 URL 地址中擷取查詢資訊,為方法增加一個名為“genre” 的字串型別參數,當我們這樣做的時候,ASP.NET MVC 就會自動把任何名為 genre 的請求參數的值賦予這個參數。

//
// GET: /Store/Browse?genre=?Disco
public string Browse(string genre)
{
string message = HttpUtility.HtmlEncode("Store.Browse, Genre = " + genre);
return message;
}

注意:

我們使用了HttpUtility.HtmlEncode 方法來處理使用者的輸入,這樣可以防止使用者的指令碼插入式攻擊。例如:/Store/Browse?Genre=<script>window.location=’http://hackersite.com’</script>.

現在,我們在瀏覽器中訪問一下:/Store/Browse?Genre=Disco

下一步,我們處理 Details 這個 Action,使它能夠處理名為 ID 的整數型別參數。這次,我們不再在請求參數中傳遞這個整數,而是嵌在請求的 URL 地址中。例如:/Store/Details/5。

在 ASP.NET MVC 中,我們可以輕易地完成這個任務而不需要配置任何東西,ASP.NET MVC 預設的路由約定會將跟在 Action 方法之後的部分看作名為 ID 的參數的值,如果你的 Action 方法有一個名為 ID 的參數,那麼,ASP.NeT MVC 就會自動將這部分作為參數傳送給 Action 方法,需要注意的是,MVC 可以協助你完成資料類型之間的轉換,所以,地址的第三部分一定要可以轉換為整數。

//
// GET: /Store/Details/5
public string Details(int id)
{
string message = "Store.Details, ID = " + id;
return message;
}

  再次運行程式訪問/Store/Details/5

總結一下我們完成的任務:

  • 建立了一個 ASP.NET MVC 項目
  • 討論了基本的專案檔夾
  • 學習了如何運行程式開發伺服器
  • 建立了兩個控制器 HomeController 和 StoreController
  • 為控制器增加了 Action 方法。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.