天天看點

ASP.NET MVC 從零開始 - create and run

這篇文章是從我的 github 部落格 http://lxconan.github.io 導入的。

如果你想用 ASP.NET MVC 建立一個網絡應用,那麼你可以搜到很多的文章。但是沒有多少文章告訴你,如何從零開始建立一個 ASP.NET MVC 應用程式。這對我們是非常有害的,我們希望了解每一個細節,搞清 Components 之間的聯系。然後,再放心的使用向導建立 ASP.NET MVC 應用程式。需要表明一點的是,我說的從零開始,是從零開始一步一步建立 App,我希望你應該熟悉 C#,并至少對 ASP.NET MVC 多多少少有些了解。

我們将使用 ASP.NET MVC 5,是以請至少準備好一個支援 .NET 4.5 的 Visual Studio 版本(2012 或者 2013)。如果沒有銀子購買專業版或者以上版本,那麼用免費的 Express 版本也是不錯的。

首先我們要建立一個空白的 Web Application。打開 visual studio 并建立一個空白的 Web Application。為了照顧新同學我大發善心的告訴你,應該選擇

ASP.NET Empty Web Application

。微軟會非常友好的添加一大堆你可能一輩子都用不着的程式集引用。是以我們第一件事兒就是删掉他們。删到如下程度為止:

Solution
|-Homework.App
    |-Properties
    |   |-AssemblyInfo.cs
    |-References
    |   |-System
    |   |-System.Core
    |-Web.config
           

安裝 ASP.NET MVC 5 Packages

在前幾個 ASP.NET MVC 版本的時候,你需要從官方網站上下個包,然後點 Setup 然後……總之一切都顯得有點兒不專業,好在現在不用了。打開 nuget manager ,安裝

Microsoft ASP.NET MVC

,或者在 package management console 裡面輸入:

Install-Package Microsoft.AspNet.Mvc -Version 5.0.0
           

這個 package 會安裝以下三個依賴包:

Microsoft ASP.NET Razor

Microsoft ASP.NET Web Pages

以及

Microsoft Web Infrastructure

。以下的東西不用記,如果有興趣,你可以當看小說似的看一下:

  • 其中第一個包是 ASP.NET MVC 的 Razor 的語言解析器,用于将 .cshtml 的服務端頁面解析為抽象文法樹,并提供編輯器支援。
  • 第二個包,也就是

    ASP.NET Web Pages

    ,提供了 ASP.NET MVC 服務端頁面編輯需要的各種輔助工具。
    • 例如,防止 XSS 和 CSRF 攻擊的輔助類型(參見

      System.Web.Helpers

      System.Web.Helpers.AntiXsrf

      名字空間)
    • Model 的用戶端驗證類型(就是類似“必須填寫”,“必須在xxx範圍之内”這種東西,當然,我對這些東西不抱有好感),以及最基本的 HTML 元素輸出的支援(

      TagBuilder

      ,這可是個好同志,如果你不用他書寫自己的

      HtmlHelper

      擴充方法,而是還在用

      string.Format()

      輸出 HTML,那麼,快去改掉那些該死的代碼)。這些都在

      System.Web.Mvc

      名字空間裡。
    • 服務端頁面的基本類型:

      WebPageBase

      。你可能驚訝的發現了一個名為

      WebPage

      的類型,并且裡面還有

      Model

      Layout

      等你耳熟能詳的屬性,你興奮的以為你找到了組織但是我隻能告訴你你搞錯了。這個

      WebPage

      真的是一坨 Rubbish。真正的 ASP.NET MVC WebPage 在

      System.Web.Mvc.WebViewPage

      裡,這是一個為了向下相容而遺留下來的曆史問題。
    • Razor 服務端頁面的編譯邏輯(在

      System.Web.WebPages.Razor

      裡)。
    • 一些好用的和過時了的頁面輔助類型(請看

      System.Web.Helpers

      )。這裡加入我的個人吐槽,如果你以後建立了一個 Framework,那麼千萬不要把輔助類加到你的 Framework 的包中,而是當作一個附加的包供大家自由下載下傳使用。否則為了向後相容性你不得不讓這些醜陋的設計一直存在下去,并被持續吐槽。
  • 第三個包,也就是

    Microsoft Web Infrastructure

    提供了 ASP.NET 的基礎架構——才怪!裡面充斥了對反射功能的封裝(服務端頁面需要這些特性)和系統環境的檢查(例如系統資料庫)。總之,加上它,ASP.NET MVC 需要它,但是我們不會使用它。

安裝好以後我們的工程看起來貌似有些料了:

Solution
|-Homework.App
    |-Properties
    |   |-AssemblyInfo.cs
    |-References
    |   |-Microsoft.Web.Infrastructure
    |   |-System
    |   |-System.Core
    |   |-System.Web.Helpers
    |   |-System.Web.Mvc
    |   |-System.Web.Razor
    |   |-System.Web.WebPages
    |   |-System.Web.WebPages.Deployment
    |   |-System.Web.WebPages.Razor
    |-Web.config
           

建立基本工程結構

Convension over configuration 是目前大家偏好的設計形式,Rails 在這方面非常典型,其他的 MVC Framework 也在這樣做。那麼我們就按照這種約定建立工程結構吧。

  • 首先我們需要一個 Controllers 名字空間來存放(預設 Area,我們以後會涉及 Area 這個概念) 下面的 Controllers 類型;
  • 另外我們需要一個 Views 檔案夾來存放服務端頁面。

像這樣:

Solution
|-Homework.App
    |-Properties
    |   |-AssemblyInfo.cs
    |-References
    |   |-Microsoft.Web.Infrastructure
    |   |-System
    |   |-System.Core
    |   |-System.Web.Helpers
    |   |-System.Web.Mvc
    |   |-System.Web.Razor
    |   |-System.Web.WebPages
    |   |-System.Web.WebPages.Deployment
    |   |-System.Web.WebPages.Razor
    |-Controllers
    |-Views
    |-Web.config
           

Hello World

看标題你就知道激動人心的時刻即将來臨了。讓我們開始最後的沖刺吧。我們要添加一個 HomeController,然後添加一個 View,View 上書寫着不變的咒語:Hello World。

這個過程網絡上的文章多如牛毛,我就簡述了,總之你應該得到如下的工程結構:

Solution
|-Homework.App
    |-Properties
    |   |-AssemblyInfo.cs
    |-References
    |   |-Microsoft.Web.Infrastructure
    |   |-System
    |   |-System.Core
    |   |-System.Web.Helpers
    |   |-System.Web.Mvc
    |   |-System.Web.Razor
    |   |-System.Web.WebPages
    |   |-System.Web.WebPages.Deployment
    |   |-System.Web.WebPages.Razor
    |-Controllers
    |   |-HomeController.cs
    |-Views
    |   |-Home
    |       |-Index.cshtml
    |-Global.asax
    |   |-Global.asax.cs
    |-Web.config
           

以上的内容我認為唯一可能出問題的就是如何建立

Global.asax

檔案,單擊右鍵,選擇建立

Glboal Application Class

就可以了。

下面我們簡單過一下新添加的檔案的内容。其中,Index.cshtml 中的内容應該是類似這樣的:

@inherits System.Web.Mvc.WebViewPage

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
    <head>
        <title>Index</title>
    </head>
    <body>
        <h1>Hello World!</h1>
    </body>
</html>                

這裡我們有必要解釋幾句。第一行,也就是

@inherits System.Web.Mvc.WebViewPage

這句話描述了目前頁面的類型是

System.Web.Mvc.WebViewPage

。我們之前說到了,所有的 ASP.NET MVC 頁面的基礎類型是

WebPage

,而

WebViewPage

WebPage

的一個派生類,他提供了 MVC 的頁面需要的所有方法和屬性,例如

Model

屬性,

Html

屬性,

Layout

屬性。

第二行,也就是

@{ Layout = null; }

這一行,說明了我們這個服務端頁面的所有布局資訊都在這裡,沒有主機闆頁的影響。關于

Layout

我們後續文章會有涉及。

接下來我們看看

HomeController

,它裡面的内容是這樣的。

using System.Web.Mvc;

namespace Homework.App.Controllers
{
    [RoutePrefix("home")]
    public class HomeController : Controller
    {
        [Route("")]
        public ActionResult Index()
        {
            return View();
        }
    }
}                

HomeController

類中僅僅包含一個

GET

方法

Index()

他直接傳回了

View()

這樣,ASP.NET MVC 将依據

Home/Index.cshtml

的内容生成頁面并傳回給用戶端。

哦,我敢肯定你發現了什麼不同:

[RoutePrefix]

[Route]

是個什麼東西,原來的

Route

不是需要用

RouteCollection.MapRoute()

方法注冊嗎?漂亮!這是 ASP.NET MVC 5 提供的新特性(從 sinatra 抄過來的,不過我一點沒有鄙夷的意思,因為 ASP.NET MVC 在不斷的改進。大家一直都在互相抄,當一個新的語言或者 Framework 形成的時候,大家做的第一件事情就是把我們在其他語言和 Framework 上做的工作完完整整的重新抄一遍)。

問題是,原來我們需要在 Web 應用程式啟動的時候使用

RouteTable.Routes.MapRoute()

指定路由的模版,那麼現在要怎麼做呢?請打開

Global.asax.cs

檔案,删掉那些不用的方法,隻留下如下的内容。

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace Homework.App
{
    public class Global : HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.MapMvcAttributeRoutes();
        }
    }
}                

Application_Start

方法會在應用程式啟動的時候調用,而其中的

RouteTable.Routes.MapMvcAttributeRoutes();

就是在聲明我們将使用

Attribute

進行路由的解析。

你是否迫不及待的按下了 Ctrl + F5 并且看到了期待已久的 Hello World?恭喜你!在下一節中我們将讨論一些 web.config 的配置的問題。

轉載于:https://www.cnblogs.com/lxconan/p/aspnet-mvc-from-zero-create-and-run.html