[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
Component
@code {//可脑补为 public class CounterButton:ComponentBase{
//c#代码,属性、方法。。
}
```
4. 处理c#代码:
增加属性 Count,增加方法 Click
```
[Parameter]// 用于传递参数
public int Count { get; set; }
void Click() {
Count++;
}
```
5. 处理Html标记, CounterButton.razor 内容如下
```
Count:@Count
@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
3. 打开RazorPanel.razor,修改 CounterButton 标记
或 省略 ` <ChildContent>`
```
七 组件引用
在想引用的子组件上定义 @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...)
- 官方模板
dotnet new -i Microsoft.AspNetCore.Blazor.Templates
[AspNetCore 3.0] 在RazorPages/MVC 中使用 Blazor (Razor组件)的更多相关文章
- [.Net Core] 在 Mvc 中简单使用日志组件
在 Mvc 中简单使用日志组件 基于 .Net Core 2.0,本文只是蜻蜓点水,并非深入浅出. 目录 使用内置的日志组件 简单过渡到第三方组件 - NLog 使用内置的日志 下面使用控制器 Hom ...
- AspNet MVC中各种上下文理解
0 前言 AspNet MVC中比较重要的上下文,有如下: 核心的上下文有HttpContext(请求上下文),ControllerContext(控制器上下文) 过滤器有关有五个的上下文Actio ...
- ASP.NET MVC中的错误-友好的处理方法
转自:http://blog.csdn.net/lizhao1226/article/details/6367400 “/”应用程序中的服务器错误. 无法找到资源. 说明: HTTP 404.您正在查 ...
- MVC中的错误过滤器无法拦截URL路径错误的解决办法
“/”应用程序中的服务器错误. 无法找到资源. 说明: HTTP 404.您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用.请检查以下 URL 并确保其拼写正确. 请求 ...
- windows server 证书的颁发与IIS证书的使用 Dapper入门使用,代替你的DbSQLhelper Asp.Net MVC中Action跳转(转载)
windows server 证书的颁发与IIS证书的使用 最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选 ...
- [AspNetCore 3.0 ] Blazor 服务端组件 Render, RenderFragment ,RenderTreeBuilder, CascadingValue/CascadingParameter 等等
一.组件 支撑Blazor的是微软的两大成熟技术,Razor模板和SignalR,两者的交汇点就是组件.通常,我们从ComponentBase派生的类型,或者创建的.razor 文件,就可以称作组件. ...
- ASP.NET Core 5.0 MVC中的 Razor 页面 介绍
Razor 是一个用于将基于服务器的代码嵌入到网页中的标记语法. Razor语法由 Razor 标记.c # 和 HTML 组成. 通常包含 Razor 的文件的扩展名 cshtml Razor 语法 ...
- Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用
Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019 ...
- IIS5.1、IIS6.0、IIS7.5中安装配置MVC 3
本文主要介绍在IIS5.1.IIS6.0.IIS7.5中安装配置MVC 3的具体办法! 正文: IIS5.1 1. 安装Microsoft .net FrameWork 4.0安装包; 2. 安装AS ...
随机推荐
- 设计模式(C#)——06桥接模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 在早先,几乎每个手机的充电器接口都是不同的.每个型号的手机都有一个充电器,此时我们把充电器作为一个抽象类,抽象类中提 ...
- unity编辑器扩展_08(创建自定义窗口)
代码: using UnityEngine;using UnityEditor; public class MyWidow : EditorWindow{ [MenuItem("Win ...
- 01_liteide 集成环境运行的问题
//go语言是以包为管理单位 //每个文件必须先声明包 //程序必须有一个main包 package main import ( "fmt" ) //入口函数 func main ...
- Python之流程控制——if...else...
Python之流程控制--if...else... 一.流程控制 假如把程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分岔口.当遇到分岔口时,你得判断哪条岔路是你要走的路,如果我们想让程 ...
- Linux的基本操作(一)
一.Linux的常用命令 1.ls[参数] 目录或文件 参数 -a :显示指定目录下的所有子目录与文件,包括隐藏文件: -l 以长格式显示文件的详细信息 如图: 文件类型:“-“表示常规文件:”d&q ...
- 简单详细讲解js闭包(看完不懂你砍我!!!)
<javascript高级程序设计>中闭包的概念: 闭包,其实是一种语言特性,它是指的是程序设计语言中,允许将函数看作对象,然后能像在对象中的操作般在函数中定义实例(局部)变量,而这些变量 ...
- gym/102091
https://codeforces.com/gym/102091 2018-2019 ACM-ICPC, Asia Nakhon Pathom Regional Contest A Flying S ...
- POJ-3261-Milk Patterns-二分+哈希
Milk Patterns 题意: 在一串数字中,求至少连续k次的最大子序列长度: 思路: 二分加哈希: #include <cstdio> #include <iostream&g ...
- codeforces 284 E. Coin Troubles(背包+思维)
题目链接:http://codeforces.com/contest/284/problem/E 题意:n种类型的硬币,硬币的面值可能相同,现在要在满足一些限制条件下求出,用这些硬币构成t面值的方案数 ...
- 【Offer】[21] 【调整数组顺序使奇数位于偶数前面】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,(偶数之间和奇数 ...