2020/05/06

[CSS] 列印網頁強制換頁設定

markdown ### 換頁的 CSS 相關設定 ```css page-break-before: auto|always|avoid|left|right|initial|inherit; page-break-after: auto|always|avoid|left|right|initial|inherit; page-break-inside: auto|avoid|initial|inherit; ``` 在標籤前或後換頁 ```css @media print { /* 在標籤前換頁 */ h1 { page-break-before: always; } /* 在標籤後換頁 */ footer { page-break-after: always; } } ``` 避免在文中換頁 `page-break-inside: avoid;` ```css @media print { /* 避免標籤內換頁 */ pre, blockquote { page-break-inside: avoid; } } ``` ### References - https://www.w3schools.com/cssref/pr_print_pageba.asp

2020/04/10

[EF] 使用 SqlFunctions.DatePart 解決 DataTime 日期格式化問題

markdown ### 環境 - Entity Framework 6 ### 問題 在 EF 要處理日期時間的特定格式,不能用 DateTime.ToString() 的方式來處理 例如: ``` var orders = context.Orders.Where(x => x.OrderDate.ToString("yyyy-MM").Equals("2020-04")).ToList(); ``` 執行會出現錯誤 ``` System.NotSupportedException: LINQ to Entities does not recognize the method 'System.String ToString(System.String)' method, and this method cannot be translated into a store expression. ``` 因為 ToString() 是 C# 程式語法, SQL 不認識它是正常的 ### 解決方法 透用 [DbFunctions](https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbfunctions?view=entity-framework-6.2.0&WT.mc_id=DOP-MVP-5002629) 或 [SqlFunctions](https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.sqlserver.sqlfunctions?view=entity-framework-6.2.0&WT.mc_id=DOP-MVP-5002629) 來處理日期格式問題 以下是採用 SqlFunctions.DatePart() 來取得我要的日期部分 ``` var orders = db.Orders.Where(x => SqlFunctions.DatePart("year", x.OrderDate) == 2020 && SqlFunctions.DatePart("month", x.OrderDate) == 4 ).ToList(); ``` 常用的 datepart 參數: `year`, `month`, `day`, `week`, `hour`, `minute` 詳細的 DatePart 可以查詢 [SQL 文件: DATEPART](https://docs.microsoft.com/zh-tw/sql/t-sql/functions/datepart-transact-sql?view=sql-server-ver15&WT.mc_id=DOP-MVP-5002629) ### 參考連結 - [DbFunctions](https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.dbfunctions?view=entity-framework-6.2.0&WT.mc_id=DOP-MVP-5002629) - [SqlFunctions](https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.sqlserver.sqlfunctions?view=entity-framework-6.2.0&WT.mc_id=DOP-MVP-5002629) - [SqlFunctions.DatePart Method](https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.sqlserver.sqlfunctions.datepart?view=entity-framework-6.2.0&WT.mc_id=DOP-MVP-5002629) - [SQL 文件 DATEPART](https://docs.microsoft.com/zh-tw/sql/t-sql/functions/datepart-transact-sql?view=sql-server-ver15&WT.mc_id=DOP-MVP-5002629) - [Linq Convert DateTime? to DateTime in ("dd/MM/yyyy")](https://forums.asp.net/t/1854597.aspx) - [EF DateTime格式化](https://xbuba.com/questions/51970339)

2020/03/31

[Vue] 如何轉換 jQuery 全域的 click 事件到 Vue 的相對處理方試

markdown ### 前言 採用 jQuery 引用 `$(document).click()` 的來監聽整份文件的點擊事件 文件內有其他子項目的點擊處理 `$('.myButton').click()` 那麼以 Vue 的相對處理方式為何? (範例為 Vue 2.x 版本) ### 監聽事件 在 mounted 加入 `document.addEventListener`, 事件為 `click`, callback 為在 Vue 的定義的 `onClick` 方法 ``` document.addEventListener('click', this.onClick); ``` 在 Vue 的使用如下 ```js new Vue({ ... methods: { onClick() {}, buttonClick() {} } mounted() { document.addEventListener('click', this.onClick); }, beforeDestroy() { document.removeEventListener('click', this.onClick); }, ... }); ``` 注意在 HTML 的 Vue click 事件, 需要加上 `.stop` (它等同於 `event.stopPropagation()`) 這會防止觸發它以外的事件 ```html ``` Vue 的 Event Modifiers 除了常用的 `.prevent` (等同於 `event.preventDefault()`) 及上面提及的 `.stop` 之外 還有 `.capture`, `.self`, `.once`, `.passive` 等事件修飾符 詳細文件可以參考 [Event Handling](https://vuejs.org/v2/guide/events.html) ### 參考連結 - [Vue.js + Call the click event for whole page document](https://stackoverflow.com/questions/41950432/vue-js-call-the-click-event-for-whole-page-document) - [Vue.js: Methods 與事件處理 (Event Handling)](https://cythilya.github.io/2017/04/17/vue-methods-and-event-handling/) - [Vue - Event Handling](https://vuejs.org/v2/guide/events.html)

2020/03/16

[TypeScript] 解決 TS2300: Duplicate identifier 'IteratorResult' 錯誤問題

markdown 今天在做 VS Code 套件編譯時出現以下錯誤訊息: `Duplicate identifier 'IteratorResult'` 有 2 個 *.d.ts 檔案定義相沖突 ``` Starting compilation in watch mode... ../../../npm/node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6 - error TS2300: Duplicate identifier 'IteratorResult'. 41 type IteratorResult = IteratorYieldResult | IteratorReturnResult; ~~~~~~~~~~~~~~ node_modules/@types/node/index.d.ts:74:11 74 interface IteratorResult { } ~~~~~~~~~~~~~~ 'IteratorResult' was also declared here. node_modules/@types/node/index.d.ts:74:11 - error TS2300: Duplicate identifier 'IteratorResult'. 74 interface IteratorResult { } ~~~~~~~~~~~~~~ ../../../npm/node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6 41 type IteratorResult = IteratorYieldResult | IteratorReturnResult; ~~~~~~~~~~~~~~ 'IteratorResult' was also declared here. Found 2 errors. Watching for file changes. ``` ### 解決方法 在 `tsconfig.json` 的 `compilerOptions` 區塊加上以下設定, 再重新執行編譯 透過直接跳過 Library 的檢查, 因為它不在我程式碼的控制範圍內, 把它排除即可 ``` "skipLibCheck": true, ```

2020/01/30

[.NET Core] 在本地使用 Try .NET

markdown ### 前言 微軟有個很棒的線上執行 .NET 程式的平台 Try .NET,可以到這裡試玩學習 [.NET In-Browser Tutorial](https://dotnet.microsoft.com/learn/dotnet/in-browser-tutorial/1) 而這個 Try .NET 我們也可以下載在本地端使用唷!自己創建 Sample Code 做為教育訓練用也不錯~ ### 環境 - Windows 10 - .NET Core 3.1 ### 本地使用 Try .NET 安裝文件 [Getting started with dotnet try](https://github.com/dotnet/try/blob/master/DotNetTryLocal.md) 首先需要 .NET Core 2.1 或 3.0 以上 SDK 版本,才能進行以下步驟 #### 安裝 dotnet-try 全域工具 ``` dotnet tool update -g dotnet-try ```  
#### 開始玩 samples 官方提供 3 種方式,本範例採用第一種最簡單的開始方式,直接使用工具的預設範例 先建立一個新的資料夾,切換至此資料夾位置輸入以下指令 ``` dotnet try demo ```
#### Try .NET demo project 開啟的專案畫面如下,裡面包含使用說明及教學
#### 常用指令 用來驗證執行的 sample code 是否能正確執行 ``` dotnet try verify ``` 有趣嗎?快載來玩玩吧! ### References: - [Try .NET](https://github.com/dotnet/try) - [Try .NET Samples](https://github.com/dotnet/try-samples)

2019/12/18

[ASP.NET MVC] Visual Studio 2019 v16.4.x 右鍵加入找不到 Area 的問題

markdown ### 環境 - Visual Studio 2019 v16.4.1 - ASP.NET MVC 5 ### 問題 更新 Visual Studio 版本後,找不到加入 MVC 的 Area 區域 ### 解決方法 功能被整合至 New Scaffolded Item,步驟如下: 在專案上按右鍵 --> Add 加入,選擇 New Scaffolded Item 選擇 MVC 下的 Area,即可找到 MVC 5 Area 突然找不到功能,小驚慌了一下 XD

2019/11/18

[ASP.NET MVC] 如何在 MVC 專案下使用 Unity.Mvc IoC 依賴注入

markdown ### 前言 在 ASP.NET Core 的環境, 預設早已支援 Dependency Injection (依賴注入) 的設計模式, 但在 ASP.NET MVC 5 以前的專案沒有這樣的功能, 本篇簡單介紹如何使用 Unity.Mvc 套件來達成依賴注入。 ### 環境 - Visual Studio 2019 16.3.9 - ASP.NET MVC 5 - .NET Framework 4.7.2 - NuGet 套件: [Unity.Mvc](https://github.com/unitycontainer/aspnet-mvc) 5.11.1 (Author: Unity Open Source Project) ### 在專案中加入 Unity.Mvc


安裝套件完成後,會自動在 App_Start 加入 2 個檔案: `UnityConfig.cs` 及 `UnityMvcActivator.cs`
基本上所有的啟動功能它都做完了, 我們只要針對 `UnityConfig.cs` 這個檔案加入我們的註冊的類型即可 例如:   如果有忘記註冊的類型, 卻被使用到了, 即會出現以下的錯誤訊息 ### 程式用法 在 constructor 使用 interface 即會自動注入對應的實體 是不是很方便呢? 前人種樹, 後人乘涼, 現在只要專注去做自己該對應的相關程式, 多餘的設定全都被妥當安排了。 不知道是不是因為它太簡單使用了, 所以專案連 README 文件都沒寫 XD。 所以寫一篇用法以備不時之需, 個人覺得這是目前用過最簡易使用的套件了, 因為幾乎無痛使用啊!! 範例程式: [UnityMvcDemo1](https://github.com/onecentlin/UnityMvcDemo1) ### 相關連結 - [Unity.Mvc](https://github.com/unitycontainer/aspnet-mvc)