iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 3
4

筆者目前使用的Visual Studio版號是15.8.5,
不囉嗦,直接來新增一個專案!

同步發表於個人點部落 - [鐵人賽Day03] ASP.Net Core MVC 進化之路 - 建立ASP.Net Core MVC專案

點選新增專案後記得要選ASP.Net Core
好了之後按確定。

ASP.Net Core版本記得選擇2.1,
2.0版本已於今年10月1日停止更新

選擇Web應用程式(模型-檢視-控制器)後按確定,

英文版的則選Web Application(Model-View-Controller)。
記得千萬不要選到空白專案,
不然學起來可能會有點痛苦。

我們先來看一下範本專案長怎樣。

不得不說,跟MVC5開的範本專案比起來,
ASP.Net Core光用看的就比較輕了,
但這也意味著微軟在架構上做了一定幅度的調整。

如果是寫過MVC5的朋友,
Controllers, Models, Views以及Startup.cs不會感到太陌生;
如果你先前有開過Console範本專案,
應該對Program.cs比較熟悉(你猜的沒錯)。

ASP.Net CoreProgram.cs變成我們整支Web程式執行的起點。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
   WebHost.CreateDefaultBuilder(args)
     .UseStartup<Startup>();

CreateWebHostBuilder裡面可以設定我們預設執行的初始化腳本,
預設的情況下會設定為Starpup.cs
但我們也可以自己建立,
以下創建一個CustomStartup.cs來做測試。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace IromanMVCWeb
{
    public class CustomStartup
    {
        public CustomStartup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });


            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=About}/{id?}");
            });
        }
    }
}

大部分的東西都跟Startup.cs一樣,
我只有在最下面的路由規則內將預設的action改成About
記得順便修改你的Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
   WebHost.CreateDefaultBuilder(args)
     .UseStartup<CustomStartup>();

然後按Ctrl+F5編譯並執行。

千萬不要小看這個功能!
如果你需要在某種情境下切換腳本設定,
那它將會是一個很好的選擇。

接著我們看一下wwwroot

ASP.Net MVC5預設使用Content及Scripts來分別存管.css及.js檔,
.Net Core預設則使用css及js當作目錄名稱,
但這裡比較適合擺放自訂的css及js檔,
第三方的UI套件則存放在lib目錄底下,
終於可以不用把第三方套件分屍了(誤)。

Startup.cs主要由ConfigureServicesConfigure組成:

ConfigureServices

  • 設定網站所需的服務
  • 執行生命週期在Configure之前
  • 預設呼叫的方法Pattern為Add{Service}
  • 可使用IServiceCollection加入所需的服務
  • 註冊DI服務的地方

Configure

  • 將每個服務以中介軟體方式註冊,在架構調整上增加許多彈性
  • 中介軟體(Middleware)註冊的順序會影響請求事件發生的結果

ConfigureServices與Configure也可以在Program裡面進行註冊,
有興趣的讀者可以參考MSDN

.Net Core 2.1的範本專案中,
將必須的Middleware加入Startup。
如靜態檔案瀏覽、Https重導向、Cookie政策以及Mvc Middleware等,

比起先前1.0手動加入的版本方便許多。

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

有關Middleware的內容,

筆者會於下一篇做更詳細的介紹。

參考

https://docs.microsoft.com/zh-tw/aspnet/core/fundamentals/startup?view=aspnetcore-2.1


上一篇
[鐵人賽Day02] - 什麼是MVC
下一篇
[鐵人賽Day04] - 淺談Middleware
系列文
菜鳥練等區-ASP.Net Core MVC進化之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言