Blazor入门-基础知识+vs2022自带例程的理解

参考:
Blazor 教程 - 生成首个应用
https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/intro

Blazor基础知识:Visual Studio 2022 中的Blazor开发入门_vs2022 blazor webassembly-CSDN博客
https://blog.csdn.net/mzl87/article/details/135543830

[问题解决][edge]你现在无法访问 XXX.com,因为网站使用的是 HSTS。网络错误和攻击通常是暂时的,因此该页面以后可能会恢复正常。_因为网站使用的是 hsts。网络错误和攻击通常是暂时的,因此该页面以后可能会恢复正-CSDN博客
https://blog.csdn.net/ted_guangda/article/details/129010030

本地环境:win10, visual studio 2022 community


目录

  • 创建项目
    • 报错
      • ResolvePackageAssets任务意外失败... NuGet unable to find fallback package folder xxx
      • 启动后网页显示隐私错误 NET::ERR_CERT_INVALID
  • 目录说明
  • 详细说明
    • 布局
    • 网页
      • index
      • Counter
      • FetchData

Blazor 使用 .NET 和 C# 构建全栈web应用,无需编写JavaScript。

创建项目

创建过程全部选默认,改动2处:

  • 框架选了.Net 6.0
  • 去掉了https配置(后面解释
    在这里插入图片描述
    如果找不到上图的话装一下:
    在这里插入图片描述
    然后点击生成,运行:
    在这里插入图片描述

报错

ResolvePackageAssets任务意外失败… NuGet unable to find fallback package folder xxx

在这里插入图片描述
这个很简单,去红线所指的位置新建文件夹即可。

启动后网页显示隐私错误 NET::ERR_CERT_INVALID

在这里插入图片描述
一个办法是直接在键盘输入 this is unsafe (不用打回车,就这几个字符就行)即可进入网页:
在这里插入图片描述
这个算个后门吧,不过因为我只是在测试,直接关掉https配置即可(前面创建项目时)。

搜解决办法的时候还有人说换火狐浏览器可以,我没有测试。我这里edge和chrome都不行。

目录说明

在这里插入图片描述

详细说明

布局

整个网页的布局写在Shared/MainLayout.razor,如下。其中:

  • @inherits LayoutComponentBase表示将从LayoutComponentBase类继承所有功能和属性,用户可以重写以定制注入导航栏、侧边栏等组件
  • <NavMenu />实际是自定义的blazor组件,参见Shared/NavMenurazor
  • <article>是一个HTML标签,通常包裹一个独立的内容块
  • @Body指明了主体内容在哪里。Pages下那些独立的页面会显示在这个位置
  • 相关的css写在同名.css文件中
    在这里插入图片描述
@inherits LayoutComponentBase<PageTitle>BlazorApp1</PageTitle><div class="page"><div class="sidebar"><NavMenu /></div><main><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></main>
</div>

再看一下NavMenu元件。

<div class="top-row ps-3 navbar navbar-dark"><div class="container-fluid"><a class="navbar-brand" href="">BlazorApp1</a><button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu"><span class="navbar-toggler-icon"></span></button></div>
</div><div class="@NavMenuCssClass" @onclick="ToggleNavMenu"><nav class="flex-column"><div class="nav-item px-3"><NavLink class="nav-link" href="" Match="NavLinkMatch.All"><span class="oi oi-home" aria-hidden="true"></span> Home</NavLink></div><div class="nav-item px-3"><NavLink class="nav-link" href="counter"><span class="oi oi-plus" aria-hidden="true"></span> Counter</NavLink></div><div class="nav-item px-3"><NavLink class="nav-link" href="fetchdata"><span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data</NavLink></div></nav>
</div>@code {private bool collapseNavMenu = true;private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;private void ToggleNavMenu(){collapseNavMenu = !collapseNavMenu;}
}

前面html不用看,重点看一下这句:

private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;

这句表示:如果collapseNavMenu为true,则将NavMenuCssClass设置为"collapse";否则设为null。NavMenuCssClass是侧边栏主体部分的属性,在同名.css文件中是:

@media (min-width: 641px) {.navbar-toggler {display: none;}.collapse {/* Never collapse the sidebar for wide screens */display: block;}
}

也就是说,当窗口宽度大于641px时,通过设置.display: block; 实现了保持导航栏折叠按钮隐藏的效果,并确保侧边栏保持展开状态,以适应较宽屏幕设备的显示效果。
在这里插入图片描述

网页

index

在这里插入图片描述

红圈部分对应的是:Pages/Index.razor,内容是:

@page "/"<PageTitle>Index</PageTitle><h1>Hello, world!</h1>Welcome to your new app.<SurveyPrompt Title="How is Blazor working for you?" />

说明:

  • @开头的属于c#代码,@page指明了当前页的路径
  • <PageTitle>是blazor定义的一个组件,其实就是显示在标题栏的名字,也就是上图蓝圈的文字
  • <SurveyPrompt>是自定义的一个组件,放在Shared/SurveyPrompt.razor,内容是:
    	<div class="alert alert-secondary mt-4"><span class="oi oi-pencil me-2" aria-hidden="true"></span><strong>@Title</strong><span class="text-nowrap">Please take our<a target="_blank" class="font-weight-bold link-dark" href="https://go.microsoft.com/fwlink/?linkid=2149017">brief survey</a></span>and tell us what you think.
    </div>@code {// Demonstrates how a parent component can supply parameters[Parameter]public string? Title { get; set; }
    }

Counter

在这里插入图片描述
Counter页面多加了一个按钮,点击这个按钮,Current count: 后会更新点击次数:
在这里插入图片描述

@page "/counter"<PageTitle>Counter</PageTitle><h1>Counter</h1><p role="status">Current count: @currentCount</p><button class="btn btn-primary" @onclick="IncrementCount">Click me</button>@code {private int currentCount = 0;private void IncrementCount(){currentCount++;}
}

说明:

  • @code表示后面的花括号里包含的是c#代码
  • 页面上使用@ + 变量名就可以使用变量值
  • @onclick直接使用@code定义的函数

FetchData

在这里插入图片描述
这是一个带数据模型的页面,先看 FetchData.razor :

@page "/fetchdata"<PageTitle>Weather forecast</PageTitle>@using BlazorApp1.Data
@inject WeatherForecastService ForecastService<h1>Weather forecast</h1><p>This component demonstrates fetching data from a service.</p>@if (forecasts == null)
{<p><em>Loading...</em></p>
}
else
{<table class="table"><thead><tr><th>Date</th><th>Temp. (C)</th><th>Temp. (F)</th><th>Summary</th></tr></thead><tbody>@foreach (var forecast in forecasts){<tr><td>@forecast.Date.ToShortDateString()</td><td>@forecast.TemperatureC</td><td>@forecast.TemperatureF</td><td>@forecast.Summary</td></tr>}</tbody></table>
}@code {private WeatherForecast[]? forecasts;protected override async Task OnInitializedAsync(){forecasts = await ForecastService.GetForecastAsync(DateTime.Now);}
}

说明:

  • @using BlazorApp1.Data是使用这个命名空间
    // Data/WeatherForecast.cs
    namespace BlazorApp1.Data
    {public class WeatherForecast{public DateTime Date { get; set; }public int TemperatureC { get; set; }public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);public string? Summary { get; set; }}
    }
    
  • inject是注入服务
    	// Data/ WeatherForecastService.cs
    namespace BlazorApp1.Data
    {public class WeatherForecastService{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate){return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = startDate.AddDays(index),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray());}}
    }
    
  • @if中@表示是c#代码,直接用就行,后面@foreach也是类似

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSSCTF | [SWPUCTF 2021 新生赛]jicao

打开题目&#xff0c;发现高亮显示了一个 php 脚本 这是脚本的内容 <?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;…

idea中数据库的连接(保姆级)

点击idea中的database 然后再点击加号 创建 然后选择第一栏data source 再选择mysql 然后选择数据库的连接方式 再输入密码 这里我们本来就是localhost所有就不用改 选择端口号 然后点击Test Connection 测试连接 第一次连接会下载连接的文件 我们只需要 等待它下载完成就好了 …

文本批量操作指南:文本合并技巧,批量处理大量文本的方法

在数字化时代&#xff0c;文本处理成为我们日常生活和工作中不可或缺的一部分。无论是整理文档、数据分析还是内容创作&#xff0c;我们都需要处理大量的文本数据。为了提升工作效率&#xff0c;掌握文本批量操作和合并的技巧变得尤为重要。本文将为您提供一份详细的文本批量操…

机器学习算法应用——CART决策树

CART决策树&#xff08;4-2&#xff09; CART&#xff08;Classification and Regression Trees&#xff09;决策树是一种常用的机器学习算法&#xff0c;它既可以用于分类问题&#xff0c;也可以用于回归问题。CART决策树的主要原理是通过递归地将数据集划分为两个子集来构建决…

力扣 256. 粉刷房子 LCR 091. 粉刷房子 python AC

动态规划 class Solution:def minCost(self, costs):row, col len(costs), 3dp [[0] * col for _ in range(row 1)]for i in range(1, row 1):for j in range(col):dp[i][j] costs[i - 1][j - 1]if j 0:dp[i][j] min(dp[i - 1][1], dp[i - 1][2])elif j 1:dp[i][j] m…

【QT教程】QT6硬件高级编程实战案例 QT硬件高级编程

QT6硬件高级编程实战案例 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免…

【GoLang基础】通道(channel)是什么?

问题引出&#xff1a; Go语言中的通道&#xff08;channel&#xff09;是什么&#xff1f; 解答&#xff1a; 通道&#xff08;channel&#xff09;是 Go 语言中用于协程&#xff08;goroutine&#xff09;之间通信和同步的机制。通道提供了一种安全、简单且高效的方式&#x…

idea运行SpringBoot项目爆红提示出现:Java HotSpot(TM) 64-Bit Server VM warning...让我来看看~

在运行SpringBoot项目的时候&#xff0c;发现总有这个警告提示出现&#xff0c;有点强迫症真的每次运行项目都很难受啊&#xff01;那么今天便来解决这个问题&#xff01; 先来看一下提示内容&#xff1a;Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none an…

FreeRTOS标准库例程代码

1.设备STM32F103C8T6 2.工程模板 单片机: 部分单片机的程序例程 - Gitee.comhttps://gitee.com/lovefoolnotme/singlechip/tree/master/STM32_FREERTOS/1.%E5%B7%A5%E7%A8%8B%E6%A8%A1%E6%9D%BF 3.代码 1-FreeRTOS移植模板 #include "system.h" #include "…

C语言编程中布尔设置位掩码示例

在C语言编程中&#xff0c;当你想使用整数&#xff08;通常是unsigned int或uint8_t, uint16_t, uint32_t等&#xff09;的位来存储多个布尔设置时&#xff0c;你会使用位掩码。每个设置对应于整数中的一个位&#xff0c;你可以通过位操作&#xff08;如按位与&、按位或|、…

Rust:用 Warp 库实现 Restful API 的简单示例

直接上代码&#xff1a; 1、源文件 Cargo.toml [package] name "xcalc" version "0.1.0" edition "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies] warp "…

uniap之微信公众号支付

近来用uniapp开发H5的时候&#xff0c;需要接入支付&#xff0c;原来都是基于后端框架来做的&#xff0c;所以可谓是一路坑中过&#xff0c;今天整理下大致流程分享给大家。 先封装util.js&#xff0c;便于后面调用 const isWechat function(){return String(navigator.userA…

队列的实现(使用C语言)

完整代码链接&#xff1a;DataStructure: 基本数据结构的实现。 (gitee.com) 目录 一、队列的概念&#xff1a; 二、队列的实现&#xff1a; 使用链表实现队列&#xff1a; 1.结构体设计&#xff1a; 2.初始化&#xff1a; 3.销毁&#xff1a; 4.入队&#xff1a; 5.…

OC foudation框架(下)的学习

OCfoudation框架&#xff08;下&#xff09; 前面学习了有关OCfoudation框架的部分内容&#xff0c;我们现在对于后面的内容继续学习。 文章目录 OCfoudation框架&#xff08;下&#xff09;数组&#xff08;NSArray和NSMutableArray&#xff09;对集合元素整体调用方法排序使用…

会赚钱的人都在做这件事:你了解吗?

在我们日常生活的点滴中&#xff0c;以及在各种场合的交互中&#xff0c;利他思维始终扮演着不可或缺的角色。当我们追求合作与共赢时&#xff0c;单方面的自我立场显然是不够的&#xff0c;真正的关键在于换位思考&#xff0c;寻找并满足对方的需求。 互利互赢的核心理念正是利…

设置docker容器时区

设置docker容器时区 查看当前系统时间 1.1 查看当前系统版本 cat /etc/issue1.2 查看当前系统时间 date查看镜像默认时间 2.1 alpine镜像 sudo docker run -it --rm alpine date2.2 ubuntu镜像 sudo docker run -it --rm ubuntu date2.3 centos镜像 sudo docker run -it --rm …

虚拟知识付费系统源码推荐,在线教育双十一怎么做活动?

又是一年光棍节&#xff0c;啊不是&#xff0c;剁手节。小伙伴们早就摩拳擦掌准备剁手了&#xff0c;这个时候&#xff0c;几乎所有线上平台都行动起来了&#xff0c;而在线教育行业也没有闲着。如今&#xff0c;双十一已经成为了各大在线教育公司用来变现的一个大杀器&#xf…

ruoyi-vue-pro 使用记录(4)

ruoyi-vue-pro 使用记录&#xff08;4&#xff09; CRM数据库线索客户商机合同回款产品其他 CRM 文档 主要分为 6 个核心模块&#xff1a;线索、客户、商机、合同、回款、产品。 线索管理以 crm_clue 作为核心表客户管理以 crm_customer 作为核心表商机管理以 crm_business 作…

JavaScript数组(Array)方法 - toReversed、toSorted、toSpliced

最近发现几个数组方法&#xff0c;是一些常规方法的升级版&#xff0c;比较有意思&#xff0c;分享给大家 文章目录 一、温故二、知新toReversedtoSortedtoSpliced 一、温故 我们先来回顾几个比较常用的方法&#xff1a;reverse&#xff0c;sort&#xff0c;splice众所周知&a…

luceda ipkiss教程 69:导出器件或者线路的三维模型

ipkiss 3.12版加入write_obj函数&#xff0c;可以直接输出器件的三维模型。 如&#xff0c;输出自定义的mmi的三维模型&#xff1a; 代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class MMI1x2(i3.PCell):"""MMI with …