Blazor带我重玩前端(四)
布局
Blazor中的布局和MVC中的布局是类似的。
创建布局
新建一个Razor页面,所有新增的布局都要继承LayoutComponentBase,同时标识自定义内容的输出位置,即标识Body的位置。如图所示:

应用布局
我们修改一下index.razor页面中的代码,增加@layout MyLayout。运行后,按F12查看网页源代码如下:

布局的内容被<app></app>标签包着,这也意味着,我们的layout并不是页面的全部内容,而仅仅只是blazor相关的内容。
顺便说一下,布局是可以“继承”的,也就是说,我们可以声明一个新的布局继承自MainLayout.razor ,只需要指定如下代码即可:
1: @inherits LayoutComponentBase
2: @layout MainLayout
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
路由
路由定义
1. 路由模板
定义在App.razor中:
1: <Router AppAssembly="@typeof(Program).Assembly">
2: <Found Context="routeData">
3: <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
4: </Found>
5: <NotFound>
6: <LayoutView Layout="@typeof(MainLayout)">
7: <p>Sorry, there's nothing at this address.</p>
8: </LayoutView>
9: </NotFound>
10: </Router>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
里面有三个重要组件:
- Found:路由机制渲染存在的页面
- RouteView:接收路由数据和默认的布局
- NotFound:路由机制渲染不存在的页面,当然我们可以自己定义404内容
2. 定义路由
路由定义很简单,只需要前缀@page,然后定义你的路由名称即可,如@page “index”。当然一个页面可以定义多个路由。如下:
- @page “/index”
- @page “/”
- @page “/home/index”
定义与约束路由参数
这个其实和ASP.NET Core API的路由方式没有太大区别,包括路由约束部分。
1: @page "/Index/{Theme}"
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
接收参数的方式也很简单,需要声明一个get;set的属性,并且必须是public的,同时需要用Parameter特性去标识。
1: @{
2: [Parameter]
3: public string Theme{get;set;}
4: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
以下是路由约束,相比于MVC,这些约束也没什么变化。

导航组件
我们先看一个例子
1: <div class="@NavMenuCssClass" @onclick="@ToggleNavMenu">
2: <ul class="nav flex-column">
3: <li class="nav-item px-3">
4: <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
5: <span class="oi oi-home" aria-hidden="true"></span> Home
6: </NavLink>
7: </li>
8: <li class="nav-item px-3">
9: <NavLink class="nav-link" href="MyComponent" Match="NavLinkMatch.Prefix">
10: <span class="oi oi-plus" aria-hidden="true"></span> My Component
11: </NavLink>
12: </li>
13: </ul>
14: </div>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
NavLinkMatch有两个枚举:
- NavLinkMatch.All:当匹配整个URL时,可以路由到页面
- NavLinkMatch.Prefix:这是默认使用的,当匹配到当前URL的前缀时,可以路由到页面。如https://localhost:5001/MyComponent和 https://localhost:5001/MyComponent/AnotherSegment
接下来我们看一下如果通过代码方式进行页面跳转,那就是可以使用NavigationManager进行页面跳转,其实例是通过注入获取的。
@inject NavigationManager NavigationManager
|
成员 |
描述 |
|
Uri |
获取当前的绝对URL |
|
BaseUri |
获取根URI(末尾带斜杠),然后以此追加相对路径进而组合成绝对URI |
|
NavigateTo |
导航到指定的 URI(前提是设置forceLoad 为true) 使用此方式,会绕过客户端路由,使得浏览器会强制刷新页面 如:UriHelper.NavigateTo("/DataList/" + Index, forceLoad); |
|
LocationChanged |
当导航位置更改时触发的事件 |
|
ToAbsoluteUri |
将相对 URI 转换为绝对 URI |
|
ToBaseRelativePath |
给定一个根 URI(例如,以前由BaseUri返回的 URI),将绝对 URI 转换为带有根URI 前缀的相对 URI |
其他
Blazor虽然提供了十分丰富而又灵活的路由功能,但目前还没有一个明确的功能让我们使用可选参数,但是我们可以变通一下,就是设置接收的数据类型为可空类型。代码如下:
1: @page “DataList/{Index:int}”
2: [Parameter]
3: public int? Index { get; set; }
4: protected override void OnInitialized()
5: {
6: base.OnInitialized();
7: Index = Index?? 1;
8: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
Blazor带我重玩前端(四)的更多相关文章
- Blazor带我重玩前端(一)
写在前面 曾经我和前端朋友聊天的时候,我说我希望有一天可以用C#写前端,不过当时更多的是美好的想象,而现在这一切正变得真实…… 什么是Blazor 我们知道浏览器可以正确解释并执行JavaScript ...
- Blazor带我重玩前端(三)
写在前面 需要升级VS2019以及.NET Core到最新版(具体的最低支持,我已经忘了,总是越新支持的就越好),以更好的支持自己开发Blazor项目. WebAssembly 搜索Blazor模板 ...
- Blazor带我重玩前端(五)
概述 本文主要讨论Blazor事件内容,由于blazor事件部分很多,所以会分成上下两篇,本文为第一篇,后续会有第二篇. 我们可以视组件是一个类,我们先看一下前文所说的Index.Razor页面生成的 ...
- Blazor带我重玩前端(二)
概览 Blazor目前有两种托管模式,一种是Server-Side模式,一种是WebAssembly模式.官方首先支持的是Service-Side模式,使用WebAssembly模式,需要更新到最新版 ...
- Blazor带我重玩前端(六)
本文主要讨论Blazor事件内容,由于blazor事件部分很多,所以会分成上下两篇,本文为第二篇. 双向绑定 概述 如图所示 当点击单项绑定的时候,MyOnewayComponent里的属性值会发生变 ...
- 重学前端 --- Promise里的代码为什么比setTimeout先执行?
首先通过一段代码进入讨论的主题 var r = new Promise(function(resolve, reject){ console.log("a"); resolve() ...
- 重学前端--js是面向对象还是基于对象?
重学前端-面向对象 跟着winter老师一起,重新认识前端的知识框架 js面向对象或基于对象编程 以前感觉这两个在本质上没有什么区别,面向对象和基于对象都是对一个抽象的对象拥有一系列的行为和状态,本质 ...
- node十年心酸史,带你了解大前端的由来!
前言 近年来,随着前端的丰富,前后端分离是趋势.各种东西如雨后春笋一般,层出不穷.node.js的出现,使前端真正意义上变成了大前端. 前端由来之HTML发展史 1990 年,Tim Berners- ...
- 厉害!我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证!
小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...
随机推荐
- es性能调优---写优化操作
ES 的默认配置,是综合了数据可靠性.写入速度.搜索实时性等因素.实际使用时,我们需要根据公司要求,进行偏向性的优化. 写优化 假设我们的应用场景要求是,每秒 300 万的写入速度,每条 500 字节 ...
- 微信小程序 wx:if 多条件判断
<view wx:if="{{a}}">单个条件</view> <view wx:if="{{a || b}}">多个或条件 ...
- MySQL新密码机制介绍caching_sha2_password
MySQL添加了对身份验证插件的支持,该插件现在称为mysql_native_password.该mysql_native_password插件使用SHA1哈希 将密码(SHA1(SHA1(passw ...
- Spring Cloud Alibaba系列(五)sentinel实现服务限流降级
一.sentinel是什么 sentinel的官方名称叫分布式系统的流量防卫兵.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.在Spring Clou ...
- IDEA开发工具使用 git 创建项目、拉取分支、合并分支
转载自:https://blog.csdn.net/qq_39470733/article/details/80366435 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有 ...
- 循环中的自变量-break和continue
1.break 作用:break 用于终止循环的执行, 过程:当执行到break语句后,程序将跳出循环,执行循环语句后边的代码 i=1 while i<10: if i==5: break pr ...
- .NET 开源项目 StreamJsonRpc 介绍
StreamJsonRpc 是一个实现了 JSON-RPC 通信协议的开源 .NET 库,在介绍 StreamJsonRpc 之前,我们先来了解一下 JSON-RPC. JSON-RPC 介绍 JSO ...
- GoLand 2020.1.3破解教程
此教程适用于GoLand 2020.1.3其他版本理论上是一样的. GoLand建议从官网下载---->>>>>>下载 1 如果之前有激活留下的补丁文件,建议卸载删 ...
- NPOI升级版本问题
最近做了一个导出Word的功能,需要样式与排版果断选择了NPOI,本以为支持Excel很好,支持Word应该也不会错吧,万万没想到还是挣扎了小一星期. 我的项目是一个13年项目,NPOI版本还很旧,我 ...
- node+express+static完成简单的文件下载
不多说什么,直接上代码 var express = require('express'); var fs = require('fs') var path= require('path'); var ...