發表文章

目前顯示的是 4月, 2020的文章

ASP.NET MVC5 - HTML Helpers

圖片
HTML Helpers 可以用來 create HTML components, 可以用來協助 display strongly typed Model Label Helpers : 產生 HTML 的 <label></label> @Html.Label("Email Address") 為了要讓這一個 lable 有 css, 我們可以 create 一個 class 的 property, 但是 class 在 c# 是 reserved word, 所以要在 class 前面加一個 @ 表示 escaped char @Html.Label("Email Address", new { @class = "control-label"}) 但是 Label 裡面有一個 HTML attribute 叫做 for, 這一個 for 是要跟 input 綁住關係的, 如果要加上這一個 for 在 Label, 就必須要用 HTML.LabelFor() , 裡面參數可以用 lambda function 選擇我們要的 Model @Html.LabelFor(m => m.Username, "Email address", new { @class = "control-label" }) 上面的 code 和下面的 code 是完全一樣的 <label for="username" class="sr-only">Email address</label> Html.TextBoxFor() : 產生 Html 的 <input> @Html.TextBoxFor(m => m.Username, new { @class = "form-control", placeholder = "Email address", autofocus = "" }) 上面的 code 跟下面的 code 是完全一樣的 <input id=...

ASP.NET MVC5 - Strongly Typed Model

圖片
@model Directive 為了解決 weakly typed 的問題, 通常因為 weakly typed 的 properties 大部分都是 string ( ViewData ), 或者是直到 runtime 才知道的 dynamic properties ( ViewBag ), 如果裡面有 error, compile 的時候會不知道, 要等到 runtime 會知道 解決辦法: @model List<Product> 下面這一行的 Model 就是上面所宣告的 model, 也就是 a list of Product @foreach(var product in Model) { } 使用範例 : 1.先去 Models folder create a class, 我這裡使用的是 Login.cs, 裡面有 2個 properties, 叫做 Username 和 Password 2.到 Views/Login/Index.cshtml 中拿到 Model 的 Username, Model? 表示是 optional, 如果沒有 Username 的話, default 就會是 null 3.到 LoginController 的 POST method 的 Index(), 傳入 Login 這一個 Model 作為參數 ​

Passing data from controller to the view

圖片
ViewData : 是一個 key value 的 dictionary, key 的 data type 規定是 string, ViewData 的 life time value 只會存在這一個 current request ViewBag : 是一個 dynamic typed, 可以裝任何的 typed using set method, 也可以直接 get 裡面所裝的 object, life time 的 value 只會存在這一個 current request TempData : 跟 ViewData 一樣是 key-value dictoinary, 但是 life time value 會持續到 next request, 比較常用的是在 redirect 時要記得 model 的 state 使用方法: 可以把 ViewBag 的 key 叫做 Product, 並且 assign 一個 product object 給 ViewBag , 這裡只是使用方便, 所以直接 hardcode product, 一般的狀況要用 LINQ 去 database 拿資料, 並且在 assign 最後在 Views/Details.cshtml 來拿到這一個 ViewBag 裡面的東西 ​

Scaffold Identity into the Current Project

圖片
適用 .NET Core v3 1.打開SqlServer, 並在 DB run 以下這一個 script https://gist.github.com/akatakritos/96b0c3136f8498246fa810d393927f04 2.在 Models folder 裡面加入 ApplicationUser 和 ApplicationRole class 3.打開自己的 DBContext, 並且把繼承後面的 DBContext 改成 IdentityDbContext<ApplicationUser, ApplicationRole, string> , 並且在同一個 DBContext 檔案裡面, 下面的 method 是 OnModelCreating() , 在裡面加入 base.OnModelCreating(modelBuilder); 4.去 Startup.cs 的 ConfigureServices register 這一個 ApplicationUser 跟 ApplicationRole 5.去 _LoginPartial.cshtml inject ApplicationUser 6.最後執行這一段 script INSERT INTO AspNetRoles (Id, Name, NormalizedName) Values ('1', 'Administrator', 'Administrator'); INSERT INTO AspNetRoles (Id, Name, NormalizedName) Values ('2', 'Customer', 'Customer'); Insert INTO AspNetUserRoles (RoleId, UserId) (Select '1', Id from AspNetUsers); ​

ASP.NET Web API - Filters

圖片
Filters : inject some logic into the request pipeline Authentication Authorization Action Result Exception 每一個 filter 在 pipeline 的執行順序都不一樣, 第一種叫做 AuthenticationFilters, 這個會根據 cookie verify your identity, 第二種是 AuthorazitaionFilters, 是用來掌管 what to do, 第三種是 ActionFilters, Action前後都可以使用, 第四種是 ResultFilters, 當前面的 ActionFilters 結束時, 可能會 return 一個 View, 假設你想要 parse html 做最後的處理, 可以render view 之前用這一個 ResultFilters, 最後是 ExceptionFilters, 處理 Exceptions Exception Filters 用來 handle exceptions 的 Filters 這裡舉一個例子, 在 update 我們的資料庫之前, 必須先檢查我們要 insert 的資料裡面有沒有 unique 的 constraint, 如果這個時候 table 有 unique constraint, 但是我們又輸入一樣的資料, 這個就會造成 Exception, 所以我們可以寫一個 DbUpdateExceptionFilterAttribute, 這一個 filter 會繼承 ExceptionFilterAttribute 這一個 base class 如果要用在 Controller, 可以在 method 上面加上 Attribute 就可以了 ​

Login Controller

圖片
Login

Attribute Routing

圖片
use a request to route to a controller action method instead of using routing table Route attribute : 可以指定哪一個 ActionResult 來 Match 這一個 URL, 因為 Route Attribute 是從網站的最源頭開始, 所以並不用加 / , 範例1, 如果 URL 是 https://mysite/product , 那麼這一個 URL 就會 hit Index action, 並回傳 View, 範例 2, 如果 URL 是 https://mysite/product/list , 那麼 URL 就會 hit List() 這一個 action, 並且回傳 List 的 View Route prefix attribute: Route prefix attribute 主要是用來定義一整個 class 的 route, 如果 Url 是 https://mysite/product , 那麼這一個 controller 就會是這一個 URL 主要的負責人 Override route prefix: 有時候如果我想要在 ProductController 裡面突然有另外一個 Route 可以跟 ProductController 的 Action 一起坐使用, 那麼我就可以 override 這一個 route, 開頭要用 ~ 來表示從 root route 開始, 而不是從 /product 開始, 接下來就可以寫要 hit 這一個 action 所需的字, 以這一個例子, 就是 https://mysite/product-list , 雖然裡面並沒有 product 的 controller, 但是仍然可以生存在 product controller 裡面因為我們 override the route prefix Route attribute for controller defaults: 可以在 class controller 裡面指定 default action Customer parameters for single route 在 route 裡面, 也可以自己指...

Routes in MVC

Routes in MVC: Route 可以用來 map URL 的 Request, 甚麼意思呢? 假設我現在我寫一個 blog 在我的網頁上, 這個時候可能的網址就是 https://mysite/blog/create , 其中 blog 在 MVC 的 Routing table 眼裡, 他是一個 controller, create 表示這一個 blog controller 裡面會有一個 method(action) 方法叫做 create, 那麼我又突然想去找之前的文章修改一下, 當我按下編輯的按鈕, 而這顆按鈕背後的邏輯是去找 blog controller 裡面的 edit action, 那這一篇文章是 id = 5, 所以找到 id = 5 的那一個並顯示出來, 這麼一來 url 有可能是 https://mysite/blog/edit/5 , 簡單來說, routes 可以用簡單的 table 來表示 Routing Table Controller Action Route Code Home Index /home public Index() Home Error /home/error public Error() Home About /home/about public About() Blog Index /blog public Index() Blog Create /blog/create public Create() Blog Post /blog/post public Post() ​

Entity Framework 到底是怎麼跟 Database 作互動 (modeling the database)?

圖片
- EF Core 會先去看全部的 DBSet, 這一些 DBSet 都是在自己的 DbContextClass(StoreContext) 的 property(紅色箭頭所指的地方), 那麼這一些 property(Carts, Categories, OrderDetails, Orders, Products, Users) 裡面又是一個 class - 以 Carts 這一個 Property 來說, 裡面是一個 class, 那麼 EF Core 就會去這一些 property(Carts, Categories, OrderDetails, Orders, Products, Users) 找到這幾個 class 的關聯性, (因為這一些 property 都是從 Database 的 table 轉過來的, 所以可能就會有 Foreign key constraint or primary key constraint etc. (table name 變成 class name, table field 變成這一個 class 的 property)) - EF Core 找到這幾個的關聯性後, 又會跑回這一個 Application 的 DBContext 執行 `OnModelCreating` 這一個 method, 執行完後, 會再 EF Core Library 產生這一個 Database 的 Model, 這樣就完成了

What is Dependency Injection?

圖片
這裡使用 Asp.Net Core (C#) 作範例: What is Dependency Injection(DI) ? 當一個 object (一定要是 object) 當作參數傳入一個 function 的時候, 這個過程就叫做 Dependency Injection. 範例 : 可以看到 ShopController 的 constructor 有 2 個參數, 一個是 Database connection, 另外一個是 configuration, 這 2 個的 data type 都是 Object, 所以當這 2 個參數傳進來的時候, function 才會決定要做什麼樣的事, 如果使用 Asp.Net Core 使用 DI, 通常程式設計師會把要 inject 的 instance variable 會有 _(下底線) 的標示 另外一個可以比較好理解的例子是假如我給你一把斧頭, 並叫你去工作, 那你會拿那一把斧頭拿去砍, 而不會拿去切, 但是如果我給你的是一個鋸子, 那你會拿那一個鋸子拿去切, 而不是用鋸子去砍東西, 所以對應在程式碼上, 你 = ShopController, 傳進去的參數可能會是鋸子或者是斧頭, 你一開始並不知道, 你只知道的是如果拿到的是鋸子, 就用鋸的, 拿到斧頭, 就用砍的, 所以你(ShopController) 會根據當時所傳入的工具(參數) 作相對應的事情, 這就是 Dependency Injection. 這一個例子就不是 Dependency Injection, 因為著一個傳進去的參數是一個值(value), 而不是一整坨的 Object ​