[AspNetCore 3.0] 在RazorPages/MVC 中使用 Blazor (Razor组件)
时间:2019-09-29
本文章向大家介绍[AspNetCore 3.0] 在RazorPages/MVC 中使用 Blazor (Razor组件),主要包括[AspNetCore 3.0] 在RazorPages/MVC 中使用 Blazor (Razor组件)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
开发环境
Vs2019 16.3.1 dotnetcore 3.0
一、开始
- 新建webapp项目
dotnet new webapp -o projectname
或Vs 中新建项目选择 Web应用程序。
在StartUp.cs 中增加两处配置。
ConfigureServices 方法:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();//启用服务端blazor支持
}
Configure 方法
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapBlazorHub();// js,singalr
});
使用Vs打开项目,默认页面和目录暂时不动, 新增文件夹 RazorComponents
- 在项目根目录下,右键菜单添加-新建项-Razor组件,命名
_Imports.razor
,用于导入razor组件所需命名空间(作用类似mvc中的_ViewImports.cshtml)。
此文件对同级或子级文件夹中的*.razor生效, 将内容替换为
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Web;
- 在RazorComponents 文件夹上 右键菜单添加-新建项-Razor组件,命名
CounterButton.razor
。
二、 组件 CounterButton.razor
说明:
- 呈现为html button 元素 ,显示当前计数。
- 用户单击按钮时回传给服务端,将计数+1,随后更新客户端文本。
- CounterButton.razor
.razor文件本质为一个继承ComponentBase,名为CounterButton的c#类(全名为项目名称.文件夹.CounterButton)。
打开CounterButton.razor 文件可以看到,@code指令(预览6之前的@functions)将文件分为两部分,上部为html标签,下部即为CounterButton类的实现部分。
CounterButton.razor
<h3>Component</h3>
@code {//可脑补为 public class CounterButton:ComponentBase{
//c#代码,属性、方法。。
}
- 处理c#代码:
增加属性 Count,增加方法 Click
[Parameter]// 用于传递参数
public int Count { get; set; }
void Click() {
Count++;
}
- 处理Html标记, CounterButton.razor 内容如下
<button @onclick="Click" >
Count:@Count
</button>
@code {
[Parameter]
public int Count { get; set; }
void Click() {
Count++;
}
}
此时组件代码已完成,接下来转到Pages目录下,处理.cshtml
三、在.cshtml中使用
- 打开Pages/Index.cshtml,在你想要显示组件的地方插入代码
@(await Html.RenderComponentAsync<RazorComponents.CounterButton>(RenderMode.Server))
- RenderMode 说明
- 如果在Pages/_ViewImports.cshtml 加入using projectname.RazorComponents 调用如下
@(await Html.RenderComponentAsync<CounterButton>(RenderMode.Server))
- 打开Pages/Shared/_Layout.cshtml, 加入
<script src="_framework/blazor.server.js"></script>
- 保证此脚本在组件render 位置之后加入
- 启动项目,打开浏览器,点击 button 查看效果。
- 打开浏览器调试窗口-networks选项卡,其中 以_blazor开头的即为组件使用的signalR连接
四、使用组件参数
在之前的组件代码中有这样一行
[Parameter]// 用于传递参数
public int Count { get; set; }
可以用来设置初始化参数,如果在另一个.razor 文件中,我们可以这样设置 Count的初始值
<CounterButton Count="2" />
但是,使用Html.RenderComponentAsync 时, RenderMode 为Server或ServerPrerendered 不支持参数。RenderMode.Static 仅输出静态Html(无法与服务端交互)。
在目前阶段,我们可以使用一个无参数的razor组件过渡一下。
- 在项目中新增razor组件 ‘RazorPanel.razor’,为了演示,将此组件加到项目根目录下。
- 代码如下
//根据业务,将需要组合的razor组件放在一个组件内,可以方便的处理参数及组件间的关系
<CounterButton Count="3"/>// 在_Imports.razor 中加入@using projectname.RazorComponents 或使用全名<projectname.RazorComponents.CounterButton Count="3"/>
- 修改组件调用
@(await Html.RenderComponentAsync<RazorPanel>(RenderMode.Server))
五 直接继承ComponentBase 实现组件
前面说过,组件是继承 ComponentBase的,因此可以用一个c#代码文件实现组件,以下以Icon为例。
- 此Icon组件使用svg use方式,对应的js 定义来自[iconfont.cn]
- 新建组件 'Icon.razor'.
- 新建c#类 'Icon.razor.cs'.
public class IconBase: Microsoft.AspNetCore.Components.ComponentBase
{
[Parameter]
public string IconName { get; set; } = "icon-user";
[Parameter]
public string IconClass { get; set; } = "icon";
}
- 文件名可以随意,使用*.razor.cs 格式 vs会帮你将.cs和对应的.razor组织在一起。
- 打开 Icon.razor,清除自动生成的内容,在第一行加入
@inherits IconBase
完整代码
@inherits IconBase
<svg class="@IconClass" aria-hidden="true">
<use href="#@IconName"></use>
</svg>
<style scoped>
.icon {
height: 1em;
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
</style>
- 目前.razor 自动生成的类 为 class Icon 而不是 partial class Icon ,因此.cs 文件里的类名不能是Icon。也只能通过 @inherits 关联 .razor 里的html和c#代码。
- .razor 看起来和vue组件有点类似
- @if @foreach 等指令见文档
- use标签中使用 href
- 在Pages/Shared/_Layout.cshtml 引入从[iconfont.cn]下载的js(通常为 iconfont.js);
- 在 RazorPanel.razor 中加入Icon :`
六 组件嵌套
razor组件上可以使用ChildContent 属性嵌套其他组件,比如需要在CounterButton中加入一个Icon.
- 在CounterButton.razor 中增加一个属性
[Parameter]
public RenderFragment ChildContent { get; set; }
- 修改html 部分
<button @onclick="Click">
@ChildContent
Count:@Count
</button>
- 打开RazorPanel.razor,修改 CounterButton 标记
<CounterButton Count="3">
<ChildContent>
<Icon IconName="icon-user" />
</ChildContent>
</CounterButton>
或 省略 <ChildContent>
<CounterButton Count="3" >
<Icon IconName="icon-user" />
</CounterButton>
七 组件引用
在想引用的子组件上定义 @ref ="组件引用名",在当前组件上定义同名字段捕获引用。
比如 在 RazorPanel.razor 中,给CounterButton 增加属性
<CounterButton Count="3" @ref="button" >
<Icon IconName="icon-user" />
@button.Count
</CounterButton>
@code
CounterButton button;//自动捕获 @ref="button" 的CounterButton 实例
其他
- 手工处理html标记
使用 RenderTreeBuilder 上的方法处理标记,注意序号。
RenderFragment 委托,ComponentBase.BuildRenderTree 方法
- 在cshtml 上渲染.razor 组件时,使用类似 RazorPanel 之类的容器来处理参数传递。
- Microsoft.AspNetCore.Components.* 包括一些内置组件(Forms,Input*,Layout...)
原文地址:https://www.cnblogs.com/cerl/p/11606235.html
- Oracle压缩黑科技(二)—压缩数据的修改
- 在Pivotal Web Service上发布Spring Boot应用
- hdu---(1325)Is It A Tree?(并查集)
- spark2 sql编程样例:sql操作
- hdu----(1599)最大子矩阵(几何/dp)
- Go语言简单的TCP编程
- hdu---(1054)Strategic Game(最小覆盖边)
- Swagger Starter 1.4.0发布:新增swagger功能开源与全局参数的配置。
- Go语言语法汇总
- 整理的一些模版LCS(连续和非连续)
- 以太坊开发实战(第1部分:智能合约)
- spark2 sql读取数据源编程学习样例2:函数实现详解
- hdu---(4310)Hero(贪心算法)
- 数据库容器化|未来已来
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言分析协变量之间的非线性关系
- stata如何处理结构方程模型(SEM)中具有缺失值的协变量
- stata对包含协变量的模型进行缺失值多重插补分析
- 互联网直播点播平台go语言搭建重定向和反向代理的区别及使用
- UNIX时间戳和北京时间的相互转换
- R语言对苏格兰独立民意调查的Meta分析
- 案例:归档自动清理脚本失效及连带影响
- R语言中固定与随机效应Meta分析 - 效率和置信区间覆盖
- R语言使用 LOWESS技术图分析逻辑回归中的函数形式
- R语言在逻辑回归中求R square R方
- R语言Poisson回归的拟合优度检验
- R语言ROC曲线下的面积-评估逻辑回归中的歧视
- 东芝MCU实现位带操作
- 单向链表的一点儿感悟
- rt-thread的内存管理分析