2018年12月6日 星期四

Blazor 4 Bootstrap 對話窗顯示與關閉練習

Blazor 4 Bootstrap 對話窗顯示與關閉練習

更多關於 Blazor 教學影片,可以參考 Blazor 教學影片播放清單 或者 Blazor 快速體驗教學影片撥放清單。也歡迎訂閱本 .NET / Blazor / Xamarin.Forms 影片頻道 。

通常在進行開發一個類似 CRUD 的應用程式,使用者可能會點選某一筆紀錄,接著進行修該該紀錄的內容,接著就會點選 儲存 按鈕,此時大多會在網頁上顯示一個對話窗,詢問使用者是否要儲存該筆紀錄,不會使用者點選了 確定 或者 放棄 按鈕,該對話窗將會從螢幕上再度隱藏並且消失了。在這篇文章中,將會說明如何使用 Blazor 開發出這樣的應用,當然,還是秉持著完全都使用 .NET C# 的方式,而沒有使用到 JavaScript 來進行開發的精神;在這裡使用了 Bootstrap Modal 功能,來模擬使用者要刪除一筆員工紀錄的時候,會顯示一個對話窗詢問使用者,真的要刪除這筆紀錄嗎?該對話窗內會有該員工紀錄的詳細資料,並且還有兩個按鈕,分別是 是 與 否,而不論使用者點選了哪個按鈕,在這個元件上都會有一個 .NET C# 的按鈕事件綁定在一起。本篇文章的範例原始碼,可以從 BlazorModal 取得。

建立測試專案

現在可以開始建立第一個 Blazor 開發專案。
  • 啟動 Visual Studio 2017
  • 點選功能表的 [檔案] > [新增] > [專案] 功能表選項
  • 在 [新增專案] 對話窗中左邊區域,選擇 [已安裝] > [Visual C#] > [Web] > [ASP.NET Core Web 應用程式]
  • 在對話窗的下方的 [名稱] 欄位中,輸入這個練習專案的名稱 BlazorModal
  • 在對話窗的下方的 [位置] 欄位中,選擇這個專案要儲存的檔案路徑
  • 最後點選對話窗的右下方 [確定] 按鈕
  • 在 [新增 ASP.NET Core Web 應用程式] 對話窗左上方區域,在第一個下拉選單,選擇 [.NET Core] 在第二個下拉選單,請選擇最新的 ASP.NET Core 版本,在現在這個時間點,可以選擇 [ASP.NET Core 2.1]
  • 在對話窗中間區域,請點選 [Blazor] 這個項目
  • 最後點選對話窗的右下方 [確定] 按鈕

修正 Counter 元件,發佈特定事件通知

為了要做到上面提到的效果,在這裡進行修正了 Counter 元件的原始碼,當使用者按下 Click me 按鈕,且 currentCount 變數值為偶數,則將會顯示出來這個對話窗。
該對話窗已經宣告在這個元件上,不過,預設因為變數 ShowDialog 為 false,所以,該對話窗的內容不會顯示在網頁上,因此,當 currentCount 變數值為偶數的時候,將會把 ShowDialog 變數值為 true,也因此<div class="modal " tabindex="-1" style="display:block" role="dialog">...</div> 這些 HTML 標記就會顯示在網頁上,也就是該對話窗內容。
在該對話窗上的兩個回應按鈕,也透過了 Blazor 的按鈕事件綁定方式,綁定到該元件內的特定方法,例如,對於 是 這個按鈕,將會使用 <button class="btn btn-danger" onclick="@CloseModalYes">是</button> 這樣的標籤來宣告,當按下了這個按鈕之後,將會執行該元件內的 CloseModalYes 委派事件方法,此時,該變數 DeleteResult 將會設定為 是的,刪除這筆員工資料 這個文字字串,而該變數也綁定在網頁之上,因此,在網頁上也會看到這個文字;而對於 否 按鈕,將會使用 <button class="btn btn-warning" onclick="@CloseModalNo">否</button> 這個 HTML 標籤來宣告,當 CloseModalNo 方法被觸發之後,因為變數 DeleteResult 將會設定為 不,放棄刪除這筆員工資料 這個文字字串,而該變數也綁定在網頁之上,因此,在網頁上也會看到這個文字。
現在,請依照底下說明來修正專案程式碼
  • 請打開 [Pages] 資料夾內的 [Counter.cshtml] 檔案
  • 使用底下程式碼替換掉 [Counter.cshtml] 檔案內容
 Pages > Counter.cshtml
@page "/counter"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" onclick="@IncrementCount">Click me</button>

<p>刪除選擇:@DeleteResult</p>

<div class="modal" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                <h4 class="modal-title">Modal title</h4>
            </div>
            <div class="modal-body">
                <p>Contents go here...</p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
            </div>
        </div>
    </div>
</div>
@if (ShowDialog)
{
    <div class="modal " tabindex="-1" style="display:block" role="dialog">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h3 class="modal-title">刪除員工資料</h3>
                </div>
                <div class="modal-body">
                    <h4>你確定要刪除這筆員工資料嗎 ??</h4>
                    <table class="table">
                        <tr>
                            <td>姓名</td>
                            <td>@emp.Name</td>
                        </tr>
                        <tr>
                            <td>性別</td>
                            <td>@emp.Gender</td>
                        </tr>
                        <tr>
                            <td>部門</td>
                            <td>@emp.Department</td>
                        </tr>
                        <tr>
                            <td>城市</td>
                            <td>@emp.City</td>
                        </tr>
                    </table>
                </div>
                <div class="modal-footer">
                    <button class="btn btn-danger" onclick="@CloseModalYes">是</button>
                    <button class="btn btn-warning" onclick="@CloseModalNo">否</button>
                </div>
            </div>
        </div>
    </div>
}


@functions {
    int currentCount = 0;
    bool ShowDialog = false;
    string DeleteResult = "";

    public class Empolyee
    {
        public string Name { get; set; }
        public string Gender { get; set; }
        public string Department { get; set; }
        public string City { get; set; }
    }
    Empolyee emp = new Empolyee()
    {
        Name = "Vulcan Lee",
        Gender = "M",
        City = "Kaohsiung",
        Department = "IT"
    };

    void IncrementCount()
    {
        currentCount++;
        DeleteResult = "";

        if (currentCount % 2 == 1)
        {
            ShowDialog = true;
        }
    }

    void CloseModalYes()
    {
        ShowDialog = false;
        DeleteResult = "是的,刪除這筆員工資料";
    }

    void CloseModalNo()
    {
        ShowDialog = false;
        DeleteResult = "不,放棄刪除這筆員工資料";
    }
}

執行結果

現在,請執行這個專案,點選左邊側邊攔的 Counter 項目,接著在網頁中間來點選 Click me 這個按鈕,現在將會發現到,若 currentCount 這個變數為奇數的時候,網頁上將會出現了 刪除員工資料 這個對話窗
若在對話窗中點選 是 這個按鈕,則該對話窗將會消失,且網頁上會出現 是的,刪除這筆員工資料 文字內容
若在對話窗中點選 否 這個按鈕,則該對話窗將會消失,且網頁上會出現 不,放棄刪除這筆員工資料 文字內容




沒有留言:

張貼留言