主頁 >
.NET開發 > 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(四)
基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(四)
2020-09-12 11:10:39 .NET開發
系列文章
- 基于 abp vNext 和 .NET Core 開發博客專案 - 使用 abp cli 搭建專案
- 基于 abp vNext 和 .NET Core 開發博客專案 - 給專案瘦身,讓它跑起來
- 基于 abp vNext 和 .NET Core 開發博客專案 - 完善與美化,Swagger登場
- 基于 abp vNext 和 .NET Core 開發博客專案 - 資料訪問和代碼優先
- 基于 abp vNext 和 .NET Core 開發博客專案 - 自定義倉儲之增刪改查
- 基于 abp vNext 和 .NET Core 開發博客專案 - 統一規范API,包裝回傳模型
- 基于 abp vNext 和 .NET Core 開發博客專案 - 再說Swagger,分組、描述、小綠鎖
- 基于 abp vNext 和 .NET Core 開發博客專案 - 接入GitHub,用JWT保護你的API
- 基于 abp vNext 和 .NET Core 開發博客專案 - 例外處理和日志記錄
- 基于 abp vNext 和 .NET Core 開發博客專案 - 使用Redis快取資料
- 基于 abp vNext 和 .NET Core 開發博客專案 - 集成Hangfire實作定時任務處理
- 基于 abp vNext 和 .NET Core 開發博客專案 - 用AutoMapper搞定物件映射
- 基于 abp vNext 和 .NET Core 開發博客專案 - 定時任務最佳實戰(一)
- 基于 abp vNext 和 .NET Core 開發博客專案 - 定時任務最佳實戰(二)
- 基于 abp vNext 和 .NET Core 開發博客專案 - 定時任務最佳實戰(三)
- 基于 abp vNext 和 .NET Core 開發博客專案 - 博客介面實戰篇(一)
- 基于 abp vNext 和 .NET Core 開發博客專案 - 博客介面實戰篇(二)
- 基于 abp vNext 和 .NET Core 開發博客專案 - 博客介面實戰篇(三)
- 基于 abp vNext 和 .NET Core 開發博客專案 - 博客介面實戰篇(四)
- 基于 abp vNext 和 .NET Core 開發博客專案 - 博客介面實戰篇(五)
- 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(一)
- 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(二)
- 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(三)
- 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(四)
- 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(五)
- 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(六)
- 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(七)
- 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(八)
- 基于 abp vNext 和 .NET Core 開發博客專案 - Blazor 實戰系列(九)
- 基于 abp vNext 和 .NET Core 開發博客專案 - 終結篇之發布專案
上一篇完成了博客的分頁查詢文章串列頁面的資料系結和分頁功能,本篇將繼續完成剩下的幾個頁面,
在開始主題之前重新解決上一篇的最后一個問題,當點擊了頭部組件的/posts鏈接時直接強制重繪了頁面,經過查看檔案和實踐有了更好的解決方案,
先將頭部組件Header.razor中的NavLink恢復成<NavLink class="menu-item" href=https://www.cnblogs.com/meowv/p/"posts">Posts,不需要點擊事件了,
然后在Posts.razor中添加生命周期函式OnParametersSetAsync(),在初始化完成后執行,
/// <summary>
/// 初始化完成后執行
/// </summary>
/// <returns></returns>
protected override async Task OnParametersSetAsync()
{
if (!page.HasValue)
{
page = 1;
await RenderPage(page);
}
}
判斷當前page引數是否有值,有值的話說明請求肯定是來自于翻頁,當page沒有值的時候就說明是頭部的選單點進來的,那么此時給page賦值為1,呼叫API加載資料即可,
分類串列
Categories.razor是分類串列頁面,上篇文章已經實作了從API獲取資料的方法,所以這里就很簡單了,指定接受型別,然后在生命周期初始化OnInitializedAsync()中去獲取資料,
@code{
/// <summary>
/// categories
/// </summary>
private ServiceResult<IEnumerable<QueryCategoryDto>> categories;
/// <summary>
/// 初始化
/// </summary>
protected override async Task OnInitializedAsync()
{
// 獲取資料
categories = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryCategoryDto>>>($"/blog/categories");
}
}
當獲取到資料的時候進行系結,沒有資料的時候還是顯示加載中的組件<Loading />讓他轉圈圈,
@if (categories == null)
{
<Loading />
}
else
{
<div class="container">
<div class="post-wrap categories">
<h2 class="post-title">- Categories -</h2>
<div class="categories-card">
@if (categories.Success && categories.Result.Any())
{
@foreach (var item in categories.Result)
{
<div class="card-item">
<div class="categories">
<a href=https://www.cnblogs.com/meowv/p/"/category/@item.DisplayName/">
@item.CategoryName
(@item.Count)
}
}
else
{
}
}
直接回圈回傳的資料串列categories.Result,系結資料就好,當獲取失敗或者沒有回傳資料的時候顯示錯誤提示組件<ErrorTip />

標簽串列
Categories.razor是標簽串列頁面,和分類串列HTML結構差不多一樣的,除了回傳型別和介面地址不一樣,將上面代碼復制過來改改即可,
@code{
/// <summary>
/// tags
/// </summary>
private ServiceResult<IEnumerable<QueryTagDto>> tags;
/// <summary>
/// 初始化
/// </summary>
protected override async Task OnInitializedAsync()
{
// 獲取資料
tags = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryTagDto>>>($"/blog/tags");
}
}
@if (tags == null)
{
<Loading />
}
else
{
<div class="container">
<div class="post-wrap tags">
<h2 class="post-title">- Tags -</h2>
<div class="tag-cloud-tags">
@if (tags.Success && tags.Result.Any())
{
@foreach (var item in tags.Result)
{
<a href=https://www.cnblogs.com/meowv/p/"/tag/@item.DisplayName/">@item.TagName(@item.Count)
}
}
else
{
}
}

友鏈串列
FriendLinks.razor是友情鏈接串列頁面,實作方式和上面兩個套路一模一樣,
@code {
/// <summary>
/// friendlinks
/// </summary>
private ServiceResult<IEnumerable<FriendLinkDto>> friendlinks;
/// <summary>
/// 初始化
/// </summary>
protected override async Task OnInitializedAsync()
{
// 獲取資料
friendlinks = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<FriendLinkDto>>>($"/blog/friendlinks");
}
}
@if (friendlinks == null)
{
<Loading />
}
else
{
<div class="container">
<div class="post-wrap categories">
<h2 class="post-title">- FriendLinks -</h2>
<div class="categories-card">
@if (friendlinks.Success && friendlinks.Result.Any())
{
@foreach (var item in friendlinks.Result)
{
<div class="card-item">
<div class="categories">
<a target="_blank" href=https://www.cnblogs.com/meowv/p/"@item.LinkUrl">
@item.Title
}
}
else
{
}
}

文章串列(分類)
Posts.Category.razor是根據分類查詢文章串列頁面,他接受一個引數name,我們要根據name去API查詢資料然后系結頁面即可,
這里的引數name實際上就是從標簽串列傳遞過來的DisplayName的值,它是一個比較友好的名稱,我們還要通過這個值去查詢真正的分類名稱進行展示,所以這里需要呼叫兩個API,這點在設計API的時候沒有考慮好,我們其實可以將這兩個API合并變成一個,后續再進行優化吧,這里就請求兩次,
添加兩個接收引數:分類名稱和回傳的文章串列資料,
/// <summary>
/// 分類名稱
/// </summary>
private string categoryName;
/// <summary>
/// 文章串列資料
/// </summary>
private ServiceResult<IEnumerable<QueryPostDto>> posts;
然后在OnInitializedAsync()初始化方法中呼叫API獲取資料,賦值給變數,
/// <summary>
/// 初始化
/// </summary>
protected override async Task OnInitializedAsync()
{
// TODO:獲取資料,可以在API中合并這兩個請求,
var category = await Http.GetFromJsonAsync<ServiceResult<string>>($"/blog/category?name={name}");
posts = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryPostDto>>>($"/blog/posts/category?name={name}");
if (category.Success)
{
categoryName = category.Result;
}
}
有了資料,直接在頁面上進行回圈系結,
@if (posts == null)
{
<Loading />
}
else
{
<div class="container">
<div class="post-wrap tags">
@if (categoryName != null)
{
<h2 class="post-title">- Category · @categoryName -</h2>
}
</div>
<div class="post-wrap archive">
@if (posts.Success && posts.Result.Any())
{
@foreach (var item in posts.Result)
{
<h3>@item.Year</h3>
@foreach (var post in item.Posts)
{
<article class="archive-item">
<NavLink href=https://www.cnblogs.com/meowv/p/"@("/post"+post.Url)">@post.Title
@post.CreationTime
}
}
}
else
{
}
}

文章串列(標簽)
Posts.Tag.razor是根據標簽查詢文章串列,這個和分類查詢文章串列實作方式一樣,直接上代碼,
@code {
/// <summary>
/// 標簽名稱引數
/// </summary>
[Parameter]
public string name { get; set; }
/// <summary>
/// 標簽名稱
/// </summary>
private string tagName;
/// <summary>
/// 文章串列資料
/// </summary>
private ServiceResult<IEnumerable<QueryPostDto>> posts;
/// <summary>
/// 初始化
/// </summary>
protected override async Task OnInitializedAsync()
{
// TODO:獲取資料,可以在API中合并這兩個請求,
var tag = await Http.GetFromJsonAsync<ServiceResult<string>>($"/blog/tag?name={name}");
posts = await Http.GetFromJsonAsync<ServiceResult<IEnumerable<QueryPostDto>>>($"/blog/posts/tag?name={name}");
if (tag.Success)
{
tagName = tag.Result;
}
}
}
@if (posts == null)
{
<Loading />
}
else
{
<div class="container">
<div class="post-wrap tags">
@if (tagName != null)
{
<h2 class="post-title">- Tag · @tagName -</h2>
}
</div>
<div class="post-wrap archive">
@if (posts.Success && posts.Result.Any())
{
@foreach (var item in posts.Result)
{
<h3>@item.Year</h3>
@foreach (var post in item.Posts)
{
<article class="archive-item">
<NavLink href=https://www.cnblogs.com/meowv/p/"@("/post"+post.Url)">@post.Title
@post.CreationTime
}
}
}
else
{
}
}

以上完成了以上幾個頁面的資料系結,頁面之間的跳轉已經關聯起來了,然后還剩下文章詳情頁,大家可以先自己動手完成它,今天就到這里,未完待續...
開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/13548.html
標籤:.NET Core
上一篇:Docker 跨平臺在 netCore 中的從入門到部署
下一篇:.net core3.1 abp動態選單和動態權限(思路) (二)
-
- 標籤雲
-
-
- 熱門瀏覽
-
-
WebAPI簡介
Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......
uj5u.com 2020-09-09 22:07:47 more
-
asp.net core 3.1 入口:Program.cs中的Main函式
本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......
uj5u.com 2020-09-09 22:07:49 more
-
asp.net網站作為websocket服務端的應用該如何寫
最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......
uj5u.com 2020-09-09 22:08:02 more
-
ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用
Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......
uj5u.com 2020-09-09 22:08:05 more
-
在webform中使用ajax
如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......
uj5u.com 2020-09-09 22:08:50 more
-
iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的
今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......
uj5u.com 2020-09-09 22:10:00 more
-
WebAPI-處理架構
帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......
uj5u.com 2020-09-09 22:11:13 more
-
微信門戶開發框架-使用指導說明書
微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......
uj5u.com 2020-09-09 22:15:18 more
-
WebAPI-HTTP編程模型
帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......
uj5u.com 2020-09-09 22:15:23 more
-
部署WebApi隨筆
一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......
uj5u.com 2020-09-09 22:15:48 more
-
- 最新发布
-
-
C#多執行緒學習(二) 如何操縱一個執行緒
<a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...
uj5u.com 2023-04-19 09:17:20 more
-
C#多執行緒學習(二) 如何操縱一個執行緒
C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......
uj5u.com 2023-04-19 09:16:49 more
-
記一次 .NET某醫療器械清洗系統 卡死分析
<a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...
uj5u.com 2023-04-18 08:39:04 more
-
記一次 .NET某醫療器械清洗系統 卡死分析
一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......
uj5u.com 2023-04-18 08:33:10 more
-
SignalR, No Connection with that ID,IIS
<a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...
uj5u.com 2023-03-30 17:21:52 more
-
一次對pool的誤用導致的.net頻繁gc的診斷分析
<a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...
uj5u.com 2023-03-28 10:15:33 more
-
一次對pool的誤用導致的.net頻繁gc的診斷分析
<a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...
uj5u.com 2023-03-28 10:13:31 more
-
C#遍歷指定檔案夾中所有檔案的3種方法
<a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...
uj5u.com 2023-03-27 14:46:55 more
-
C#/VB.NET:如何將PDF轉為PDF/A
<a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...
uj5u.com 2023-03-27 14:46:35 more
-
武裝你的WEBAPI-OData聚合查詢
<a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...
uj5u.com 2023-03-27 14:46:16 more
- 友情鏈接
-
-