ASP.NET Core: 全新的ASP.NET !

77rou發表於2016-07-08

背景

最新版本的 ASP.NET 叫做 ASP.NET Core (也被稱為 ASP.NET 5)   它顛覆了過去的 ASP.NET。

什麼是 ASP.NET Core?

 是一個開源跨平臺的開發框架,用於構建基於雲的現代 Web 應用 。它是從底層開始重新構建來提供效能優良的Web應用開發框架,可以部署在雲上或者本地伺服器上。另外,它使得 ASP.NET 應用更加精簡和模組化(可以根據你的應用需要向裡面新增其他模組),跨平臺(你可以很容易的在 Windows, Mac or Linux 上開發和部署你的應用),雲最佳化(你可以在雲上在雲上部署和除錯你的應用)。

以前的版本

對於使用 ASP.NET 舊版本的我們來說,這意味著什麼?

如果你正在使用舊版本的 ASP.NET 或者你有 WebForms 的開發背景,那麼你將會認識到 ASP.NET Core 有多完美,這感覺起來就像從古典的 ASP 時代來到全新的 ASP.NET 的世界。

1

現在,讓我們來一探究竟

下面列出 ASP.NET Core 1.0 的核心變化.

跨平臺的執行時

你可以在 OSX 和 Linux上執行 ASP.NET Core 應用,這對於 ASP.NET 來說,這具有跨時代的意義,也給 ASP.NET 開發者和設計師們帶來了全新的體驗。ASP.NET Core 具有兩個執行時,這意味著你可以選擇不同的執行環境來部署你的應用,使得你的應用將更加靈活。

 是一個 ASP.NET 的重構版本,它執行於最新的 .NET Core。它是模組化的,允許開發者以外掛的形式新增應用所需要的模組,大多數的功能都將作為外掛提供並透過 NuGet 程式包管理。這樣做的一個好處就是你可以升級應用的一個模組,但絲毫不會影響其他模組;另外,.NET Core 是一個跨平臺的執行時,因此你可以在 OSX 或 Linux 作業系統上部署你的應用;它也是一個雲最佳化的執行時,用於在雲上部署和除錯應用;.NET Core 可以和你的應用程式一起被部署,當伺服器上有多個 .NET Core 版本時, 你依舊可以執行 ASP.NET Core 應用。

你也可以建立只執行在 windows 下完整 .NET 框架的 ASP.NET Core 應用。

ASP.NET 4.6 是最新的完整 .NET Framework 的釋出版本,它允許你可以利用所有的 .NET 元件並且具備向後相容能力。如果你計劃將應用遷移到 .NET core,那麼你需要做適量的修改,因為 .NET Core 相對於完整 .NET Framework 來說有所限制。

需要明確的是,ASP.NET 4.6 更加成熟。它如今久經考驗並且現已釋出並可使用。ASP.NET Core 1.0 是1.0 釋出版本,包含 Web API 和 MVC,但是現在還沒有 SignalR 和 Web Pages。,它也不支援VB 和 F# 語言。

ASP.NET Core 不再只依賴Visual Studio

 的跨平臺,讓它不再只依賴 Visual Studio,開發者和設計師們可以在自己喜歡的環境上工作。比如 Sublime Text,WebStorm ,這真是太棒了!

新的工程解決方案結構

如果你使用 Visual Studio 建立了一個空的 ASP.NET Core 工程,那麼你將會看到下面的驚喜。(除非你沒有使用之前的 ASP.NET 建立過任何專案)

2

你感覺到驚喜了嗎?新的工程結構完全不一樣了, 工程模板煥然一新,包含以下的新檔案:

· global.json: 你可以在這裡放置解決方案的配置資訊和工程之間的引用。

· Program.cs: 這個檔案包含了 ASP.NET Core RC2 應用的 Main 方法,負責配置和啟動應用程式。

· src folder: 包含組成你應用程式的全部專案程式碼。

· wwwroot: 你的靜態檔案將被放置在這個資料夾,它們都將作為資源直接提供給客戶端,包含 HTML,CSS 和 JavaScript 檔案。

· project.json: 包含專案設定。在 ASP.NET Core中,你可以透過使用 NuGet 程式包管理工具(NPM)新增 NuGet 包或者編輯這個檔案來管理從屬。你可以透過任何文字編輯器來編輯這個檔案,如果你使用 Visual Studio 2015,,這將會更加 輕鬆,因為它的智慧提示會幫助你找到合適的 NuGet 包作為從屬。project.json 就像下面這樣。

3

· startup.cs 這個主要放置你 ASP.NET Core 的 stratup 和 configuration 程式碼,下面就是 stratup 類的樣子。

4

ConfigureServices 方法定義了你應用程式使用的服務,Configure 方法用來定義組成請求管道的中介軟體。

· References: 它包含了 .NETCoreApp 第一個版本執行時的引用。

WebForms

是的,WebForms 不再是 ASP.NET 5 的一部分,這真令人悲傷。你可以繼續使用 VS2015 的 .NET 4.6 來構建 Web Forms 應用,但是卻不能體會 ASP.NET 5 的新特性了。

我已經開發了很多年從小型到大型的企業級 Web Forms 應用。 我很喜歡 Web Forms,,事實上我還會繼續支援在各種論壇使用 WebForms 的社群,比如 。但是我們是時候進步了,去學習一些新東西。這是學習 ASP.NET MVC 最後的時間了,就像過去的許多事物,你要麼去適應,要麼被淘汰。

除了 WebForms, the .NET Core 也沒有包含 Windows Forms, WCF, WPF, Silverlight 等等。

VB.NET and F#

目前,在當前 ASP.NET Core 1.0 RC2 版本中, VB.NET 和 F# 也不被支援。

MVC Core 統一架構

5


ASP.NET Core 將見證 MVC, Web API 和 Web Pages(可能包含)組合在一個架構中,它被稱為 ASP.NET MVC Core。儘管當前釋出版本中,還不支援 Web Pages and SignalR。

在之前的 ASP.NET MVC 中, MVC 控制器和 Web API 控制器是不同的。 一個 MVC 控制器使用基類 System.Web.MVC.Controller ,一個 Web API 控制器使用基類 System.Web.Http.ApiController 。 在 MVC Core 中,會為它們提供一個共同的基類,就是 Microsoft.AspNetCore.Mvc.Controller 。

對於 HTML Helpers 來說,MVC 和 Web Pages 的合併是非常有可能的。 Web Pages 程式設計模型對當前版本來說還不適用,所以我們還不能負責任地說下一步計劃合併哪些特性。 但是我們可以預測到,傳統的 MVC 模型繫結將會出現。

View Components

在之前 ASP.NET MVC 中,, Html.Action() 幫助方法一般用於呼叫一個 sub-controller。ASP.NET MVC Core 將會使用新的 View Components 用來代替使用Html.Action() 的部件。

View Components 支援完全非同步,這允許你建立非同步的檢視元件。

下面是一個簡單的檢視元件的例子,根據身份會返回個人介紹。

using Microsoft.AspNetCore.Mvc; using MVC6Demo.Models; using System.Threading.Tasks; using System.Collections.Generic; namespace MVC6Demo.ViewComponents  
{ public class PersonListViewComponent : ViewComponent  
    { public async Task InvokeAsync(string status) { string viewToUse = "Default"; bool isFiltered = false;  
  
            PersonModel model = new PersonModel(); if (status.ToLower().Equals("registered")) { 
                viewToUse = "Registered"; isFiltered = true; 
            }  
                  
            var p = await GetPersonAsync(status, isFiltered); return View(viewToUse,p);  
        } private Task<ienumerable> GetPersonAsync(string status, bool isFiltered) { return Task.FromResult(GetPerson(status,isFiltered));  
        } private IEnumerable GetPerson(string status, bool isFiltered) {  
            PersonModel model = new PersonModel(); if (isFiltered) return model.GetPersonsByStatus(status); else return model.GetAll;  
  
        }  
    }  
}  </ienumerable

下面是 View Component 的檢視:

																		

Person List

    @foreach (var p in Model) {
  • @string.Format("{0} {1}",p.FirstName,p.LastName)
  • }

這裡展示瞭如何在主檢視中呼叫 View Components

																	
@await Component.InvokeAsync("PersonList", new { type = "Registered" })

新指令: @inject, @using, @inherits

ASP.NET MVC Core 提供了少量新指令。 下面我們來看看如何使用 @inject。 @inject 指令允許你注入一個類中的方法到你的檢視中。

這是一個簡單的類,來展示一些非同步的方法。

using System.Threading.Tasks; using System.Linq; namespace MVC6Demo.Models  
{ public class Stats  
    { private PersonModel _persons = new PersonModel(); public async Task<int> GetPersonCount() { return await Task.FromResult(_persons.GetAll.Count());  
        } public async Task<int> GetRegisteredPersonCount() { return await Task.FromResult(
                      _persons.GetAll.Where(o => o.Status.ToLower().Equals("registered")).Count());  
        } public async Task<int> GetUnRegisteredPersonCount() { return await Task.FromResult(
                     _persons.GetAll.Where(o => o.Status.ToLower().Equals("")).Count());  
        }  
    }  
} 

現在我們就可以在檢視中使用 @inject 指令來呼叫那些方法:

@inject MVC6Demo.Models.Stats Stats  
  
@{  
    ViewBag.Title = "Stats";  
}
															

這是不是很酷?

檢視我關於 ASP.NET MVC 新指令詳細例子的文章: 

Tag Helpers

ASP.NET MVC Core 另外一個非常酷的東西就是 Tag Helpers。對於之前的 HTML Helpers,Tag Helpers 是可選的替代語法。

所以相比於以下程式碼:

@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
            {
                @Html.AntiForgeryToken()
														

Use a local account to log in.


@Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
}

相關文章