BootstrapBlazor实战 Markdown 编辑器使用
基础工程使用工程: B08. BootstrapBlazor实战 Menu 导航菜单使用
实战BootstrapBlazorMenu Markdown 编辑器使用, 以及整合Freesql orm快速制作菜单项数据库后台维护页面
BootstrapBlazor 是 Bootstrap 风格的 Blazor UI 组件库 基于 Bootstrap 样式库精心打造,并且额外增加了 100 多种常用的组件,为您快速开发项目带来非一般的感觉
demo演示的是Sqlite驱动,FreeSql支持多种数据库,MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/神通/人大金仓/翰高/华为GaussDB/MsAccess
1.Markdown 编辑器简介
提供 Markdown 语法支持的文本编辑器
https://www.blazor.zone/markdowns
Nuget 包安装
使用 nuget.org 进行 BootstrapBlazor.Markdown 组件的安装
.NET CLI
dotnet add package BootstrapBlazor.Markdown
示例
<p>输入 <code>Markdown</code> 相关代码后,点击下方相关区域显示数据</p>
<div style="width: 100%; height: 300px;">
<Markdown @bind-Value="@MarkdownString" @bind-Html="@HtmlString" />
</div>
<div class="mt-3">
<textarea class="form-control" rows="6" disabled="disabled">
@MarkdownString
</textarea>
</div>
<div class="mt-3">
<textarea class="form-control" rows="6" disabled="disabled">
@HtmlString
</textarea>
</div>
@code{
private string? MarkdownString { get; set; } ="### 测试";
private string? HtmlString { get; set; }
}

|
参数
|
说明
|
类型
|
可选值
|
默认值
|
|---|---|---|---|---|
|
Height
|
控件高度
|
int
|
—
|
300
|
|
MinHeight
|
控件最小高度
|
int
|
—
|
200
|
|
InitialEditType
|
初始化时显示的界面
|
InitialEditType
|
Markdown/Wysiwyg
|
Markdown
|
|
PreviewStyle
|
预览模式
|
PreviewStyle
|
Tab/Vertical
|
Vertical
|
|
Language
|
UI 语言
|
string
|
—
|
—
|
|
Placeholder
|
提示信息
|
string
|
—
|
—
|
|
IsViewer
|
是否为纯浏览模式
|
bool
|
true/false
|
false
|
|
IsDark
|
是否为暗黑模式
|
bool
|
true/false
|
false
|
|
EnableHighlight
|
是否启用代码高亮
|
bool
|
true/false
|
false
|
更多例子参考 https://www.blazor.zone/markdowns
2.实战
打开工程 "BootstrapBlazor实战 Menu 导航菜单使用" , 添加 Markdown 库 BootstrapBlazor.Markdown
dotnet add b08Menu/BootstrapBlazorApp.Shared package BootstrapBlazor.Markdown
注:由于模板使用了共享库,双出Server和WebAssembly工程,我们这里只使用Server工程做演示.
3.左侧菜单加入页面编辑功能导航
在BootstrapBlazorApp.Shared/Shared/MainLayout.razor.cs文件加入代码
//在 Menus = fsql.Select<WebPages>().OrderBy(a => a.Code)之前加入代码
if (fsql.Select<WebPages>().Where(a => a.PageName == "页面编辑").Count() == 0)
{
fsql.Insert(new WebPages("页面编辑", "editpages", "fa fa-gears", "002_004")).ExecuteAffrows();
}
运行BootstrapBlazorApp.Server工程,截图如下

4.实体类加入 Markdown 字段
在BootstrapBlazorApp.Shared/Data/WebPages.cs文件加入代码
/// <summary>
/// Markdown内容
/// </summary>
[Required(ErrorMessage = "{0}不能为空")]
[AutoGenerateColumn(Visible = false)]
[DisplayName("Markdown内容")]
[Column(StringLength = -2)]
public string? Markdown { get; set; } = "";
/// <summary>
/// Html内容
/// </summary>
[Required(ErrorMessage = "{0}不能为空")]
[AutoGenerateColumn(Visible = false)]
[DisplayName("Html内容")]
[Column(StringLength = -2)]
public string? Html { get; set; } = "";
5.页面编辑功能
新建BootstrapBlazorApp.Shared/Pages/EditPages.razor文件
@page "/editpages"
@attribute [TabItemOption(Text = "页面编辑")]
@using System.Diagnostics.CodeAnalysis
<PageTitle>页面编辑</PageTitle>
<div class="row">
<div class="col-6 col-sm-6">
<Select TValue="string" Color="Color.Primary" Items="GroupItems()" OnSelectedItemChanged="OnItemChanged">
</Select>
</div>
<div class="col-2 col-sm-2">
<Button Text="保存" OnClickWithoutRender="Save" Color="Color.Primary" />
</div>
</div>
@if (TpvPage != null)
{
<div class="row">
<h5 class="m-3">页面说明</h5>
<div style="width: 100%; height: 500px;">
<Markdown Height="500" MinHeight="300" PreviewStyle="PreviewStyle.Tab" InitialEditType="InitialEditType.Wysiwyg" Language="@Language" @bind-Value="@TpvPage.Markdown" @bind-Html="@TpvPage.Html" />
</div>
</div>
}
code如下, 代码应该比较简单,关键点注释在程序里面
@code {
/// <summary>
/// 获取并设置Markdown语言
/// </summary>
private string? Language { get; set; }
[Inject]
[NotNull]
private ToastService? ToastService { get; set; }
/// <summary>
/// 注入fsql服务
/// </summary>
[Inject]
[NotNull]
IFreeSql? fsql { get; set; }
[NotNull]
List<WebPages>? Items { get; set; } = new List<WebPages>();
[NotNull]
WebPages? TpvPage { get; set; }
protected override void OnInitialized()
{
Language = CultureInfo.CurrentUICulture.Name;
}
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
//读取页面数据,显示第一页到编辑器
Items = fsql.Select<WebPages>().OrderBy(a => a.Code).ToList();
TpvPage = Items?.First();
StateHasChanged();
}
}
Task Save()
{
var res = fsql.Update<WebPages>().SetSource(TpvPage).ExecuteAffrows();
if (res > 0)
{
ToastService.Success("保存成功");
}
return Task.CompletedTask;
}
/// <summary>
/// Select 组件数据源
/// </summary>
/// <returns></returns>
private IEnumerable<SelectedItem> GroupItems()
{
if (Items == null)
{
return new List<SelectedItem>();
}
var list = new List<SelectedItem>();
foreach (var item in Items)
{
list.Add(new SelectedItem() { Value = item.Code ?? "", Text = item.PageName ?? "", GroupName = item.ParentCode ?? "" });
}
return list;
}
/// <summary>
/// 下拉选项改变时调用此方法
/// </summary>
/// <param name="item"></param>
private Task OnItemChanged(SelectedItem item)
{
TpvPage = Items.Where(a => a.Code == item.Value).First();
System.Console.WriteLine($"SelectedItem Text: {item.Text} Value: {item.Value} Selected");
StateHasChanged();
return Task.CompletedTask;
}
}
运行BootstrapBlazorApp.Server工程,截图如下

6.加入两个演示页面
在BootstrapBlazorApp.Shared/Shared/MainLayout.razor.cs文件加入代码
//在 Menus = fsql.Select<WebPages>().OrderBy(a => a.Code)之前加入代码
if (fsql.Select<WebPages>().Where(a => a.PageName == "关于我们").Count() == 0)
{
fsql.Insert(new WebPages("关于我们", "AboutUs", "fa fa-gears", "006")).ExecuteAffrows();
fsql.Insert(new WebPages("隐私政策", "PrivacyPolicy", "fa fa-gears", "007")).ExecuteAffrows();
}
运行BootstrapBlazorApp.Server工程, 打开页面编辑, 下拉选择隐私政策 , 写入Markdown代码试试
## **本隐私政策将帮助您了解以下内容:**
1. 如何收集和使用您的个人信息
2. 如何共享、转让、公开披露您的个人信息
截图如下

7.新建展示页面 Htmls.razor
新建BootstrapBlazorApp.Shared/Pages/Htmls.razor文件
@page "/{PageName}"
<PageTitle>@(TpvPage?.PageName??"Home")</PageTitle>
<div style="background-color:white">
@if (TpvPage != null)
{
<Markdown Value="@TpvPage.Markdown" IsViewer="true" />
}
else
{
<p>您访问的页面不存在</p>
}
</div>
8.新建展示页面代码 Htmls.razor.cs
新建BootstrapBlazorApp.Shared/Pages/Htmls.razor.cs文件
using BootstrapBlazor.Components;
using BootstrapBlazorApp.Shared.Data;
using Microsoft.AspNetCore.Components;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
namespace BootstrapBlazorApp.Shared.Pages;
/// <summary>
///
/// </summary>
public partial class Htmls
{
[Parameter]
public string? PageName { get; set; }
[Parameter]
public string? Language { get; set; }
[Inject]
[NotNull]
private ToastService? ToastService { get; set; }
[Inject]
[NotNull]
IFreeSql? fsql { get; set; }
[NotNull]
WebPages? TpvPage { get; set; }
string? pageName;
protected override void OnInitialized()
{
Language = CultureInfo.CurrentUICulture.Name;
}
protected override void OnAfterRender(bool firstRender)
{
PageName ??= "Index";
if (firstRender || pageName != PageName)
{
TpvPage = fsql.Select<WebPages>().Where(a => a.Url == PageName).First();
pageName = PageName;
StateHasChanged();
}
}
}
运行BootstrapBlazorApp.Server工程, 打开隐私政策, 截图如下

9.总结
Blazor 这个新鲜事物, 加上 BootstrapBlazor 组件库 100 多种常用的组件,真的可以为您快速开发项目带来非一般的感觉, 一起试试吧.
项目源码
关联项目
FreeSql QQ群:4336577(已满)、8578575(已满)、52508226(在线)
BA & Blazor QQ群:795206915、675147445
知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名AlexChow(包含链接: https://github.com/densen2014 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系 。
AlexChow
今日头条 | 博客园 | 知乎 | Gitee | GitHub
BootstrapBlazor实战 Markdown 编辑器使用的更多相关文章
- Markdown编辑器editor.md的使用---markdown上传图片
http://kindeditor.org/ 确定下有没有查找替换功能 http://pandao.github.io/editor.md/ http://pandao.github.io/edito ...
- Python技能树及CSDN MarkDown编辑器测评
测评目录 python技能树测评 python技能树是什么 python技能树长什么样 如何学习python技能树 python技能树可能需要的改进 对python技能树的总结 CSDN MarkDo ...
- NiceMark——我的Markdown编辑器
NiceMark--我的Markdown编辑器 闲来无事,写了一个Markdown编辑器.基于electron,完全采用Web前段技术(Html,css,JavaScript)实现.代码已托管在Git ...
- 好用的Markdown编辑器一览 readme.md 编辑查看
https://github.com/pandao/editor.md https://pandao.github.io/editor.md/examples/index.html Editor.md ...
- mac好用的markdown编辑器
在刚开始接触markdown的时候,就被吸引了.此后一直在找贴心的好用的markdown编辑器.印象笔记和马克飞象配合着用也是挺好的,唯一的缺点就是比较封闭,发个笔记的链接给同学,还得注册才能看,导致 ...
- 破解 Windows 下Markdown 编辑器 MarkdownPad 2
MarkdownPad 是 Windows 平台下一款优秀的 Markdown 编辑器,本文简单介绍 Markdown 以及使用一种方法破解 MarkdownPad 使其升级到专业版.该方法仅限于教育 ...
- Markdown编辑器语法指南2
人的一切痛苦, 本质上都是对自己的无能的愤怒. --王小波 1 Markdown编辑器的基本用法 1.1 代码 如果你只想高亮语句中的某个函数名或关键字,可以使用 `function_name()` ...
- 推荐一款Mac上好用的Markdown编辑器
[TOC] 推荐一款Mac上好用的Markdown编辑器 正文 我算是一位Evernote的重度用户吧.之前也尝试过为知笔记,有道云笔记,微软的onenote,最后还是觉的Evernote.因为我喜欢 ...
- React项目(一):markdown编辑器
在之前的React官网教程中,提到了用Remarkable为插件的markdown评论框.现在就来正儿八经地用另外一个插件marked.js做一个markdown编辑器吧! 准备工作 或许在做之前,应 ...
随机推荐
- 列举 Spring Framework 的优点?
由于 Spring Frameworks 的分层架构,用户可以自由选择自己需要的组件. Spring Framework 支持 POJO(Plain Old Java Object) 编程,从而具备持 ...
- 学习openldap03
ldap统一认证架构 一.ldap目录服务介绍什么是目录服务? 目录是一类为了浏览和搜索数据而设计的特殊的数据库.例如,为人所熟知的微软公司的活动目录(active directory)就是目录数据 ...
- 为什么HTTP/3要基于UDP?可靠吗?
目录 前言 为什么转用UDP? HTTP/3解决了那些问题? 队头阻塞问题 QPACK编码 Header 参考 推荐阅读: 计算机网络汇总 HTTP/3竟然是基于UDP的!开始我也很疑惑,UDP传输不 ...
- python udp socket通信
前段时间学习了一下c++的socket通信,但发现那玩意儿比较复杂还是转向python了,下面就是一个简单的udpsocket通信程序,欢迎大佬前来指正 udp聊天 import socket # 创 ...
- 单总线协议DS1820
一. DS18B20简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式.主要根据应用场合的不同而改变其外观.封装后的DS18B20可用于电缆 ...
- 1. 了解Git和Github
1. 了解Git和Github 1.1 什么是Git Git是一个免费.开源的版本控制软件 1.2 什么是版本控制系统 版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况得系统. ...
- Numpy中数组的乘法
Numpy中数组的乘法 按照两个相乘数组A和B的维度不同,分为以下乘法: 数字与一维/二维数组相乘: 一维数组与一维数组相乘: 二维数组与一维数组相乘: 二维数组与二维数组相乘: numpy有以下乘法 ...
- 【分享】WeX5的正确打开方式(6)——数据组件初探
本文是[WeX5的正确打开方式]系列的第6篇文章,简单介绍一下WeX5中数据组件的特性和结构形式. 数据组件的由来 上一篇 WeX5绑定机制我们实现了一个简单的记账本应用,当时所有数据都用 JSON ...
- 深入解析丨母婴App如何迅速收割2W新用户?
在讲案例前,我们需要先说一下精细化分析. 我们常说的精细化分析,就是一个持续"解构"的过程,通过像漏斗.留存.细分等高级分析功能,将"整体"按照事件属性解构成& ...
- Sentry前端部署拓展篇(sourcemap关联、issue关联、release控制)
原文首发于我的个人博客: https://lonhon.top/ 之前的<基础篇>主要介绍了Sentry和基本部署流程,在实际使用过程中你会发现Sentry受欢迎的原因:除了单纯的监控异常 ...