學習ASP.NET Core Blazor編程系列二十三——登錄(3)

来源:https://www.cnblogs.com/chillsrc/archive/2023/02/05/17093077.html
-Advertisement-
Play Games

背景 REST作為一種現代網路應用非常流行的軟體架構風格,自從Roy Fielding博士在2000年他的博士論文中提出來到現在已經有了20年的歷史。它的簡單易用性,可擴展性,伸縮性受到廣大Web開發者的喜愛。 REST 的 API 配合JSON格式的數據交換,使得前後端分離、數據交互變得非常容易, ...


學習ASP.NET Core Blazor編程系列文章之目錄 學習ASP.NET Core Blazor編程系列一——綜述 學習ASP.NET Core Blazor編程系列二——第一個Blazor應用程式(上)
學習ASP.NET Core Blazor編程系列三——實體 學習ASP.NET Core Blazor編程系列五——列表頁面 學習ASP.NET Core Blazor編程系列七——新增圖書 學習ASP.NET Core Blazor編程系列八——數據校驗 學習ASP.NET Core Blazor編程系列十三——路由(完) 學習ASP.NET Core Blazor編程系列十五——查詢 學習ASP.NET Core Blazor編程系列十六——排序 學習ASP.NET Core Blazor編程系列二十——文件上傳(完) 學習ASP.NET Core Blazor編程系列二十一——數據刷新  學習ASP.NET Core Blazor編程系列二十二——登錄(1)

 

       雖然在上一篇文章(學習ASP.NET Core Blazor編程系列二十三——登錄(2) )中我們製作出了登錄頁面,但那個登錄頁面,不符合我們平時使用的樣式,需要進行修改,同時也沒有實現登錄驗證。這一文章學習如何對Login.razor使用特有的佈局組件,實現正常的登錄樣式,學習使用AuthenticationStateProvider類來進行登錄驗證。

五、LoginLayout組件

        登錄頁面的佈局與之前的內容頁面中的佈局是不一樣的。例如之前的圖書編輯頁面是有側邊導航欄的,但登錄頁面顯然是不需要的。因此,我們需要單獨寫一個LoginLayout組件,和預設佈局MainLayout分開,只用於Login頁面:

     1. 在Visual Studio 2022的解決方案資源管理器中,滑鼠左鍵選中“Pages”文件夾,右鍵單擊,在彈出菜單中選擇“添加—>Razor組件…”,並將組件命名為“LoginLayout.razor”。

    2.在Visual Studio 2022的文本編輯器中打開LoginLayout.razor,我們來創建登錄頁面的佈局。代碼中的“/imgs/logo.png”所指定的logo圖片,請自行準備。具體代碼如下:

@inherits LayoutComponentBase

<div class="container">
    <div class="card">
    <div class="card-header" style="height:10%">
       <div style="margin:10px;">

            <div class="row">
                <div class="col-8">
                    <img src="/imgs/logo.png" style="align-self:center" />

                </div>

                <div class="col-8 text-center">
                    <span style="color:black; font-size:24px">歡迎使用 @ProductionName 後臺管理系統</span>

                </div>
            </div>

        </div>
    </div>
    <div class="card-body" Style="background-color:white; min-height:500px">
        <div class="row">
            <div class="col-3"></div>
            <div class="col-6">
                <div style="margin:100px 0">
                    @Body
                </div>
            </div>

        </div>
    </div>

    <div class="card-footer">

        <small class="text-muted">Copyright @Year 圖書租賃系統  Powered by .NET 6.0 </small>

    </div>
</div>
</div>
@code {

    private const string ProductionName = "圖書租賃";
    private  int Year = DateTime.Now.Year;

}

 

   六. 修改Login.razor

   1.在Visual Studio 2022的文本編輯器中打開Login.razor,我們修改一下登錄頁面。具體代碼如下:

 

@page "/Login"
@using BlazorAppDemo.Models

@using BlazorAppDemo.Utils
@layout LoginLayout

@inject NavigationManager NavigationManager

<div class="card align-items-center">
    <div class="card-body my-2">

        <h3>Login</h3>
        <hr />
        <EditForm  Model="loginModel" OnValidSubmit="SubmitHandler" OnInvalidSubmit="InvalidHandler">
            <DataAnnotationsValidator />
           
            <div class="form-group">
                <label for="userName">  @HtmlHelper.GetDisplayName(loginModel ,m=> m.UserName)</label>
                <InputText @bind-Value="loginModel.UserName" class="form-control" id="userName" />

                <ValidationMessage For="()=>loginModel.UserName" />
            </div>

            <div class="form-group">
                <label for="pwd"> @HtmlHelper.GetDisplayName(loginModel ,m=> m.Password)</label>

                <InputPassword @bind-Value="loginModel.Password" class="form-control" id="pwd" />
                <ValidationMessage For="()=>loginModel.Password" />

            </div>
            <span class="form-control-plaintext"></span>
            <div class="form-group row">

                <div class="col-sm-10">
            <button class="btn btn-primary">登錄</button>
                </div>
            </div>
        </EditForm>
    </div>
</div>
 
@code {
    private UserInfo loginModel = new UserInfo();
 
    private void SubmitHandler()
    {

        Console.WriteLine($"用戶名:{loginModel.UserName} ,密碼:{loginModel.Password}");
        NavigationManager.NavigateTo("/Index");
    }

    private void InvalidHandler()
    {

        Console.WriteLine($"用戶名: {loginModel.UserName} ,密碼:{loginModel.Password}");
    }
}

 

 

 

 

七、修改路由與啟動頁面

          如何讓Blazor知道當用登錄用戶是被授權訪問的?答案是Blazor提供的AuthenticationStateProvider。如果razor組件使用CascadingAuthenticationState,Blazor在渲染前會檢查AuthorizeRouteView中的/AuthorizeView/Authorized, NotAuthorized, Authorizing標簽,並根據獲取的信息在客戶端進行渲染成是授權的UI,還是未授權的UI。

  1.在Visual Studio 2022的文本編輯器中打開app.razor,我們來添加CascadingAuthenticationState組件。具體代碼如下:

 

@using Microsoft.AspNetCore.Components.Authorization

 <CascadingAuthenticationState>

<Router AppAssembly="@typeof(App).Assembly">
    <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
        <FocusOnNavigate RouteData="@routeData" Selector="h1" />
    </Found>

    <NotFound>
        <PageTitle>Not found</PageTitle>
        <LayoutView Layout="@typeof(MainLayout)">
            <h1>頁面走失!請確認輸入的URL是否正確!</h1>
            <p role="alert">Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>
</CascadingAuthenticationState>

 

     2. 在Visual Studio 2022的文本編輯器中打開MainLayou.razor,我們來添加AuthorizeView組件。具體代碼如下:

 

@inherits LayoutComponentBase

<PageTitle>BlazorAppDemo</PageTitle>
 
<div class="page">
    <div class="sidebar">
        <NavMenu />
    </div>
 
    <main>
        <AuthorizeView>
            <Authorized>
              <div class="top-row px-4">
            <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>

        <article class="content px-4">
                    @Body

        </article>
            </Authorized>
            <NotAuthorized>
                <div style="margin: 120px 0; width:100%; text-align: center; color: red;">
                    <span style="font-size:20px">檢測到登錄超時,請重新<a href="/login" style="text-decoration:underline">登錄</a></span>
                </div>
            </NotAuthorized>
        </AuthorizeView>
     
    </main>
</div>
       3. 在Visual Studio 2022的菜單欄上,找到“調試-->開始調試”或是按F5鍵,Visual Studio 2022會生成BlazorAppDemo應用程式,併在瀏覽器中打開Home頁面,這時我們看到的不在是之前的頁面,而是一個沒有登錄的提示信息。如下圖。

 

4.使用滑鼠左鍵點擊“登錄”超連接,頁面進入到登錄頁面。如下圖。

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Elasticsearch是位於 Elastic Stack 核心的分散式搜索和分析引擎。Elasticsearch 是索引、搜索和分析魔法發生的地方。lasticsearch 為所有類型的數據提供近乎實時的搜索和分析。無論您擁有結構化或非結構化文本、數字數據還是地理空間數據,Elasticsear... ...
  • 簡介 前幾天搗鼓了一下Ubuntu,正是想用一下我舊電腦上的N卡,可以用GPU來跑代碼,體驗一下多核的快樂。 還好我這破電腦也是支持Cuda的: $ sudo lshw -C display *-display description: 3D controller product: GK208M [ ...
  • https://www.cnblogs.com/yeungchie/ 函數功能 Perl 中 shift 函數可以返回列表的第一個元素,並將後續所有元素向前移位( 索引值減 1 )。輸入可選,預設為 @_ 或者 @ARGV。 my @foo = qw( 1 2 3 4 ); say shift @f ...
  • 今日內容概要 昨日回顧 反序列化類校驗部分源碼解析(瞭解) 斷言 drf之請求(配置解析類) drf之響應(配置響應類,Resposne的源碼的屬性) 視圖組件介紹及兩個視圖基類與五個視圖擴展類的用法介紹 . . . . 昨日回顧 # 1 序列化類的常用欄位 -CharField 。。。。 -Lis ...
  • Eureka是Netflix開發的服務發現框架,本身是一個基於REST的服務,主要用於定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。Eureka提供了完整的Service Registry和Service Discovery實現實現,也是Spring Cloud體系中最... ...
  • 前言 最近有項目需要開發檔案打包下載功能,其中包含很多大附件,項目使用minio存儲且不在同一臺伺服器上,為了優化速度決定使用windows共用功能進行文件傳輸 SMB1.0 集成jcifs類庫,主要適用於一些老舊系統,但下載速度比較慢,僅作參考 此類庫沒有maven引用,官網地址:http://j ...
  • 原文鏈接 https://bysocket.com/nginx-unexpected-end-of-file-expecting-in-key-file/ 一、Nginx unexpected end of file 問題 通過 letsencrypt 申請證書後,預設伺服器安裝了 Nginx 1. ...
  • 寫在前面 很早之前的電腦ThinkPad E440,一直沒怎麼用。最近整理了一下電腦的資料,全部備份到雲盤。整理的過程感覺電腦很慢很慢,難受極了。整理完後,終於我要對它下手了! 我製作了啟動U盤,把Ubuntu 22.04的鏡像燒錄進去,通過U盤啟動,把系統裝在ThinkPad上。居然電腦出奇的好用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...