2021年4月16日 星期五

Blazor 專案使用 SfDatePicker 選取日期

Blazor 專案使用 SfDatePicker 選取日期

使用 Syncfusion 元件來進行 Blazor 專案開發,可以立即使用 Syncfusion 所帶來的各種豐富的 UI 元件,加入 Blazor 專案的開發,在這篇文章所要探討的就是關於 SfDatePicker 這個元件所提供的功能,該元件可以提供使用者選取一個日期到 Blazor 專案內。

這個說明專案的原始碼位於 bsDatePicker

建立 Blazor Server-Side 的專案

  • 打開 Visual Studio 2019

  • 點選右下方的 [建立新的專案] 按鈕

  • [建立新專案] 對話窗將會顯示在螢幕上

  • 從[建立新專案] 對話窗的中間區域,找到 [Blazor 應用程式] 這個專案樣板選項,並且選擇這個項目

  • 點選右下角的 [下一步] 按鈕

  • 現在 [設定新的專案] 對話窗將會出現

  • 請在這個對話窗內,輸入適當的 [專案名稱] 、 [位置] 、 [解決方案名稱]

    在這裡請輸入 [專案名稱] 為 bzSyncfusion

  • 完成後,請點選 [建立] 按鈕

  • 當出現 [建立新的 Blazor 應用程式] 對話窗的時候

  • 請選擇最新版本的 .NET Core 與 [Blazor 伺服器應用程式]

  • 完成後,請點選 [建立] 按鈕

稍微等會一段時間,Blazor 專案將會建立起來

進行 Syncfusion 元件的安裝

  • 滑鼠右擊 Blazor 專案的 [相依性] 節點
  • 選擇 [管理 NuGet 套件]
  • 切換到 [瀏覽] 標籤頁次
  • 搜尋 Syncfusion.Blazor.Calendars 這個元件名稱
  • 選擇搜尋到的 [Syncfusion.Blazor.Calendars] 元件,並且安裝起來

進行 Syncfusion 元件的設定

  • 打開專案根目錄下的 [Startup.cs] 這個檔案
  • 找到 [ConfigureServices] 這個方法
  • 在這個方法的最後面,加入底下程式碼,已完成 Blazor 元件會用到的服務註冊
#region Syncfusion 元件的服務註冊
services.AddSyncfusionBlazor();
#endregion
  • 在同一個檔案內,找到 [Configure] 這個方法
  • 在這個方法的最前面,加入底下程式碼,宣告合法授權的金鑰 (License Key)
#region 宣告所使用 Syncfusion for Blazor 元件的使用授權碼
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("YOUR LICENSE KEY");
#endregion
  • 打開 [Pages] 資料夾內的 [_Host.cshtml] 檔案

  • 在 <head> 標籤內,加入需要的 CSS 宣告,如底下內容

    若沒有加入底下的宣告,將無法正常看到 Syncfusion 的元件樣貌

<link href="_content/Syncfusion.Blazor/styles/bootstrap4.css" rel="stylesheet" />

使用 SfCalendar 元件

  • 在專案的 [Pages] 資料夾
  • 打開 [Index.razor] 檔案
  • 使用底下程式碼替換到 [Index.razor] 檔案內容
@page "/"
@using Syncfusion.Blazor.Calendars

<h1>Hello, SfDatePicker!</h1>

<div>
    <div>有設定最小日期與最大日期, TValue 宣告為 DateTime? (Date1Value)</div>
    <SfDatePicker TValue="DateTime?" Min='@MinDate' Max='@MaxDate' @bind-Value='@Date1Value'></SfDatePicker>
</div>
<div>
    <div>有設定最小日期與最大日期, TValue 宣告為 DateTime (Date4Value)</div>
    <SfDatePicker TValue="DateTime" Min='@MinDate' Max='@MaxDate' StrictMode=false  @bind-Value='@Date4Value'></SfDatePicker>
</div>
<div>
    <div>有設定最小日期, TValue 宣告為 DateTime (Date2Value)</div>
    <SfDatePicker TValue="DateTime" Min='@MinDate' @bind-Value='@Date2Value'></SfDatePicker>
</div>
<div>
    <div>有設定最大日期, TValue 宣告為 DateTime (Date3Value)</div>
    <SfDatePicker TValue="DateTime" Max='@MaxDate' @bind-Value='@Date3Value'></SfDatePicker>
</div>
<div>
    <div>有設定最小日期, TValue 宣告為 DateTime? (Date5Value)</div>
    <SfDatePicker TValue="DateTime?" Min='@MinDate' @bind-Value='@Date5Value'></SfDatePicker>
</div>
<div>
    <div>有設定最大日期, TValue 宣告為 DateTime? (Date6Value)</div>
    <SfDatePicker TValue="DateTime?" Max='@MaxDate' @bind-Value='@Date6Value'></SfDatePicker>
</div>

<div class="bg-primary">
    <div class="text-white">Date1Value = @Date1Value</div>
    <div class="text-white">Date2Value = @Date2Value</div>
    <div class="text-white">Date3Value = @Date3Value</div>
    <div class="text-white">Date4Value = @Date4Value</div>
    <div class="text-white">Date5Value = @Date5Value</div>
    <div class="text-white">Date6Value = @Date6Value</div>
</div>
<SurveyPrompt Title="How is Blazor working for you?" />

@code {
    public DateTime MinDate { get; set; }
    public DateTime MaxDate { get; set; }
    public DateTime? Date1Value { get; set; }
    public DateTime? Date5Value { get; set; }
    public DateTime? Date6Value { get; set; }
    public DateTime Date2Value { get; set; }
    public DateTime Date3Value { get; set; }
    public DateTime Date4Value { get; set; }

    protected override void OnInitialized()
    {
        MinDate = DateTime.Now;
        MaxDate = DateTime.Now.AddDays(8);
        Date1Value = DateTime.Now.AddDays(2);
        Date2Value = DateTime.Now.AddDays(2);
        Date3Value = DateTime.Now.AddDays(2);
        Date4Value = DateTime.Now.AddDays(2);
        Date5Value = DateTime.Now.AddDays(2);
        Date6Value = DateTime.Now.AddDays(2);
    }
}

執行結果

從這裡看到使用 Syncfusion 元件相當的容易,只需要加入該元件所使用的命名空間在 Razor 元元件前面,接著就加入該元件的HTML標籤,例如在這裡使用的是 <SfDatePicker TValue="DateTime?" Min='@MinDate' Max='@MaxDate' @bind-Value='@Date1Value'></SfDatePicker>

現在可以直接執行這支程式,就會看到如下圖的執行結果。

首先看到這六個日期都會綁定到相對應的 ui 控制項,不論在 .NET 中的物件型別為 DateTime 或者 DateTime? ,只要宣告相對應的 TValue="DateTime" 或者 TValue="DateTime?",便可以正常運作。

當點選開 UI 控制項圖示,便會跳出萬年曆的選單,在上面的範例中,因為有設定最小與最大日期,因此,使用者儘可以在萬年曆畫面中,點選在允許範圍內的日期。

當點選開 UI 控制項圖示,便會跳出萬年曆的選單,在上面的範例中,因為僅有設定最大日期,因此,使用者儘可以在萬年曆畫面中,儘可以點選在最大日期前的允許日期。

 


2021年4月15日 星期四

在 ASP.NET Core Blazor 專案內,使用 MailKit 發送具有 HTML 格式的電子郵件

在 ASP.NET Core Blazor 專案內,使用 MailKit 發送具有 HTML 格式的電子郵件

當在進行 Blazor 專案程式設計的時候,需要能夠背景批次或者即時的來根據資料庫內的內容,發送出 SMTP 電子郵件,在這個文章中,將會說明如何使用 MailKit 這個套件來做到這樣的需求

現在來看看如何做出這樣的範例成程式碼。

這篇文章的原始碼位於 bzSendSMTP

建立Blazor Server 應用程式專案

  • 開啟 Visual Studio 2019
  • 選擇右下方的 [建立新的專案] 按鈕
  • 在 [建立新專案] 對話窗中
  • 從右上方的專案類型下拉按鈕中,找到並選擇 [Web]
  • 從可用專案範本清單內,找到並選擇 [空的 ASP.NET Core]
  • 點選左下方 [下一步] 按鈕
  • 在 [設定新的專案] 對話窗中
  • 在 [專案名稱] 欄位中輸入 bzSendSMTP
  • 點選左下方 [下一步] 按鈕
  • 在 [其他資訊] 對話窗中
  • 在 [目標 Framework] 下拉選單中,選擇 [.NET 5.0 (目前)]
  • 點選左下方 [建立] 按鈕

在 ASP.NET Core 的開發中安全儲存應用程式秘密

在這個專案內需要設定可以發送 SMTP 的相關資訊,這包含了遠端 SMTP 主機位置、使用通訊埠 Port、帳號與密碼,為了要讓這些資訊不會隨著版控一起被儲存起來,因此,這裡需要使用到 安全儲存應用程式秘密

  • 滑鼠右擊專案節點
  • 選擇 [管理使用者密碼] 彈出功能表選項
  • 此時將會看到 [secrets.json] 視窗出現
  • 請根據你的
  • 當建立一個 ASP.NET Core 專案後,會在專案跟目錄下跟目錄下請在 [bzSendSMTP] 專案根目錄下找到並且打開 [appsettings.json] 檔案
  • 使用底下的內容替換原先檔案內容
  • 在這裡新增加了一個 [中文選項1] 設定項目,而該設定項目內有3個子節點,分別為 [Child1] 、 [Child2] 、 [節點中文3]

    這裡刻意的使用中文字型,而不是僅使用英文字型,因此,要來體驗看看,當在 [appsettings.json] 檔案有中文字的時候,是否會有問題產生。

{
  "SMTPInformation": {
    "Server": "smtp.xxx.com",
    "Port": "???",
    "Accout": "user@host.com",
    "Password": "somethine"
  }
}

建立發送郵件的程式碼

  • 打開 [Pages] 資料夾內的 [] 檔案
  • 使用底下內容將其替換
@page "/"
@using MailKit.Net.Smtp
@using MailKit
@using MimeKit
@using Microsoft.Extensions.Configuration
@inject IConfiguration configuration
<h1>Hello, MailKit!</h1>

<div>
    <button class="btn btn-primary"
            @onclick="SendMailAsync">
        發送郵件
    </button>
</div>
<div class="display-1 text-success">
    @message
</div>

<SurveyPrompt Title="How is Blazor working for you?" />

@code
{
    string message;

    void SendMailAsync()
    {
        message = "";
        var sendMessage = new MimeMessage();
        sendMessage.From.Add(new MailboxAddress("vulcan_lee@hotmail.com", "vulcan_lee@hotmail.com"));
        sendMessage.To.Add(new MailboxAddress("Vulcan Lee", "vulcan.lee@gmail.com"));
        sendMessage.Subject = "恭喜你可以使用 Blazor 發送郵件";

        sendMessage.Body = new TextPart("html")
        {
            Text = @"<h1>你好</h1></br>請開始繼續下一個練習</br>你是否願意<b>繼續</b>接受挑戰?"
        };

        string Server = configuration["SMTPInformation:Server"];
        int Port = Convert.ToInt32( configuration["SMTPInformation:Port"]);
        string account = configuration["SMTPInformation:Accout"];
        string password = configuration["SMTPInformation:Password"];
        using (var client = new SmtpClient())
        {
            client.Connect(Server, Port, false);

            // Note: only needed if the SMTP server requires authentication
            client.Authenticate(account, password);

            client.Send(sendMessage);
            client.Disconnect(true);
            message = "郵件已經送出";
        }
    }
}

為了要讓這些程式碼可以正常運作,需要加入適當的參考命名空間,另外,為了要取得 安全儲存應用程式秘密 內容,因此需要注入 IConfiguration 的具體實作物件。

一旦使用者點選了 [發送郵件] 按鈕,將會觸發 SendMailAsync 方法

在這個方法內,首先建立一個 MimeMessage 物件,這裡需要宣告寄件者、收件者的 Email 電子郵件,接著,設定該郵件的主旨,最後,使用 TextPart 類別,指定建立郵件本身內容為一個 HTML 格式的郵件內容,之後將會指定給 MimeMessage.Body 這個屬性

然後,就要透過 IConfiguration 來取得之前設定 安全儲存應用程式秘密 內容。

現在,可以建立一個 SmtpClient 物件,使用這個物件來發送此封電子郵件

進行執行專案

按下 F5 開始執行這個專案,並且點選發送郵件按鈕

現在將會看到底下的畫面

從上面執行結果的螢幕截圖,可以看到 @inject IOptions<中文選項1> option1 敘述所注入 [IOptions<中文選項1>] 物件,是可以成功取得 [appsettings.json] 檔案內的設定內容。

底下將會為收到的電子郵件內容

 





2021年4月14日 星期三

使用 Visual Studio 2019 進行遠端 Windows Forms 應用程式除錯

使用 Visual Studio 2019 進行遠端 Windows Forms 應用程式除錯

安裝 Visual Studio 2019 遠端工具

  • 請在遠端電腦上,通常是沒有安裝 Visual Studio 2019 開發工具的電腦

  • 打開網址 https://visualstudio.microsoft.com/zh-hant/downloads/

  • 在下方找到 [Visual Studio 2019 的工具] > [Visual Studio 2019 遠端工具]

    您可利用 Visual Studio 2019 遠端工具,在未安裝 Visual Studio 的電腦上進行應用程式部署、遠端偵錯、遠端測試、效能分析以及單元測試。

  • 下載並且安裝 Visual Studio 2019 遠端工具

  • 當出現 [Visual Studio 2019 遠端工具安裝程式] 視窗

  • 勾選 [我同意授權條款及條件]

  • 點選 [安裝] 按鈕

  • 一旦安裝完成後,點選 [關閉] 按鈕

設定遠端偵錯程式

  • 在遠端電腦上,從 [開始] 找到 [Remote Debugger]

  • 啟動執行這個城市

  • 當 [遠端偵測組態] 是窗出現之後,確認相關設定無誤

  • 點選 [設定遠端偵測] 按鈕

  • 此時將會出現 [Visual Studio 2019 遠端偵測工具視窗]

建立 Windows Forms 專案,並且開始進行遠端偵錯

  • 請在開發者電腦上開啟 Visual Studio 2019

  • 建立一個 Windows Forms 專案

  • 隨意加入一些程式碼,並且在任意程式碼上,加入中斷點

  • 打開該 Windows Forms 的專案屬性視窗 (可以使用滑鼠雙擊 Properties 節點)

  • 切換到 [偵錯] 標籤頁次

  • 找到 [使用遠端電腦] 欄位,輸入剛剛那台遠端電腦的 IP

  • 找到 [驗證模式] 欄位,選擇輸入 [Windows 驗證]

  • 建置這個專案,確定沒有錯誤產生

  • 在遠端電腦上建立資料夾,其路徑與 Visual Studio 電腦上的 Debug 資料夾相同,接著從 Visual Studio 電腦複製您剛才建置的可執行檔到遠端電腦上新建立的資料夾

  • 現在可以開始進行該專案的除錯

  • 此時會出現 [Windows 安全性] 視窗

  • 請在這裡輸入遠端電腦的認證之帳密

  • 現在可以在遠端電腦上看到這個 Windows Forms 程式跑起來了

  • 點選遠端電腦上 [Form1] 視窗內的 [button1] 按鈕

  • 若此時 Visual Studio 停在剛剛設定的中斷點上,那就表示這個遠端專案除錯正確無誤運作中

 










2021年4月12日 星期一

Blazor 專案使用ASP.NET Core 中的選項模式取得巢狀設定宣告內容

Blazor 專案使用ASP.NET Core 中的選項模式取得巢狀設定宣告內容

在前一篇文章 Blazor 專案使用ASP.NET Core 中的選項模式取得設定宣告內容 中,說明如何使用 ASP.NET Core 中的選項模式 來取得定義在 [appsettings.json] 檔案內 (這部分可以參考 ASP.NET Core 的設定 ) 設定內容。

然而,若該 [appsettings.json] 檔案內所宣告的設定內容,具有巢狀的定義結構,這樣要如何能夠取出這些巢狀定義內容值呢?

現在來看看如何做出這樣的範例成程式碼。

這篇文章的原始碼位於 bzOptionsNest

開啟 Blazor Server 應用程式專案 並 進行修正

  • 開啟 bzOptions
  • 請在 [bzOptions] 專案根目錄下找到並且打開 [appsettings.json] 檔案
  • 使用底下的內容替換原先檔案內容
  • 在這裡,將把 [節點中文3] 節點的設定結構,改成具有多層次的樹狀架構
  • 另外,在這裡將會把每個節點的名稱,使用不同的大小寫來定義,等下來確認這樣的定義方式,會不會有任何影響
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "中文選項1": {
    "Child1": "需要使用者輸入",
    "Child2": "需要使用到資料庫",
    "節點中文3": "需要提供 Xamarin.Forms服務",
    "NestNode1": {
      "subNode1": 168,
      "SubNode2": "子節點2",
      "SUBNODE3": "子節點三"
    }
  }
}

修改 中文選項1 強型別類別

  • 請在 [bzOptions] 專案根目錄下找到並且打開 [中文選項1.cs] 檔案

  • 將該類別設計為底下內容

  • 在這裡可以看到,這裡在 [中文選項1] 類別內,建立一個屬性,其型別為 [Nestnode1]

  • 而這個 [Nestnode1] 類別內的屬性名稱,將會使用微軟建議的屬性名稱命名慣例 大小寫慣例 ,也就是 PascalCasing

    PascalCasing 慣例(用於參數名稱以外的所有識別碼)會將每個字組的第一個字元設為大寫 (包括長度超過兩個字母的縮寫)

public class 中文選項1
{
    public string Child1 { get; set; }
    public string Child2 { get; set; }
    public string 節點中文3 { get; set; }
    public Nestnode1 NestNode1 { get; set; }
}
 
public class Nestnode1
{
    public int SubNode1 { get; set; }
    public string SubNode2 { get; set; }
    public string SubNode3 { get; set; }
}

修正 Blazor 頁面元件中使用 選項模式

  • 請在 [bzOptions] 專案找到 [Pages] 資料夾
  • 在該資料夾內找到並且打開 [Index.razor] 檔案
  • 使用底下宣告標記與程式碼,替換該檔案原先內容
@page "/"
@using Microsoft.Extensions.Options
@inject IOptions<中文選項1> option1

<h1>Hello, ASP.NET Core 中的選項模式!</h1>

<div>
    <div>@option1.Value.Child1</div>
    <div>@option1.Value.Child2</div>
    <div>@option1.Value.節點中文3</div>
    <div>@option1.Value.NestNode1.SubNode1</div>
    <div>@option1.Value.NestNode1.SubNode2</div>
    <div>@option1.Value.NestNode1.SubNode3</div>
</div>
Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

@code{
    中文選項1 我的客製化選項;
    protected override void OnAfterRender(bool firstRender)
    {
        if (firstRender == true)
        {
            我的客製化選項 = option1.Value;
        }
    }
}

執行並且測試

按下 F5 開始執行這個專案

現在將會看到底下的畫面