# vditor-blazor
**Repository Path**: daqian-xiaoxiong/vditor-blazor
## Basic Information
- **Project Name**: vditor-blazor
- **Description**: 一款 Blazor markdown 编辑器
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2022-12-15
- **Last Updated**: 2022-12-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# vditor-blazor
📝 Vditor of blazor
Vditor是一款基于JS超级好用的Markdown前端组件,支持编写Markdown以及渲染Markdown。
本项目是对Js版本的Vditor的封装,以便在Blazor中使用。
# 快速入门指南
## STEP1:
在Nuget包管理器中安装:StardustDL.Razor.Components.Vditors
## STEP2:
### WASM版本:
在_Imports.razorz中添加,如下代码。
`@using Vditor`
在wwwroot/index.html文件下,添加如下内容。
```css
```
### Service版本:
和上面差不多,简单讲讲。
在_Host.cshtml中添加
```css
```
注意修改版本号,和Nuget里面的那个版本要对应起来。就是@x.x.x这几个x,需要修改,看上面的注释。
# 开始使用
## 编辑器
在Razor文件中:
```html
```
对应代码:
```csharp
string mdValue = "";
```
注意:缺少配置Upload,所以不能在Markdown中上传文件,可以看Vditor中的API文档。
下面的小例子,讲解了Upload,以及自定义Toolbar。
## 渲染Markdown文件
```html
```
绑定的`Markdown`是string类型的,里面放的是Markdown字符串。
# 一个小例子
这个小例子,将帮助您更好理解如何使用Vditor。
## 在页面中:
```html
```
## 在代码中:
```csharp
string value = "Hello Blazor!";
string html;
Editor editor;
Toolbar Toolbar = new Toolbar();
Upload upload = new Upload() {
Url = "api/upload",
Max = 2 * 1024 * 1024,
Accept = "image/*,*.doc,*.docx",
Multiple = false,
};
protected override void OnInitialized()
{
string[] keys = { "emoji",
"headings",
"bold",
"italic",
"strike",
"link",
"|",
"list",
"ordered-list",
"check",
"outdent",
"indent",
"|",
"quote",
"line",
"code",
"inline-code",
"insert-before",
"insert-after",
"|"};
Toolbar.Buttons.AddRange(keys.ToList());
CustomToolButton toolbar = new CustomToolButton()
{
ClassName = "right",
Hotkey = "⌘-⇧-S",
Icon = "",
Name = "sponsor",
Tip = "自定义Toolbar",
TipPosition = "n"
};
Toolbar.Buttons.Add(toolbar);
string[] keys2 = {"upload",
"record",
"table",
"|",
"undo",
"redo",
"|",
"fullscreen"};
Toolbar.Buttons.AddRange(keys2.ToList());
base.OnInitialized();
}
async Task Click()
{
var value = await editor.GetValueAsync();
Console.WriteLine(value);
}
void Rendererd()
{
Console.WriteLine("rendererd!");
}
void OnToolbarButtonClick(string name)
{
value += $"\r\ncustom button {name} was clicked.";
}
```
在Razor文件中Vditor.Editor中,`@ref`是对这个组件的应用,之后可以使用editor这个变量进行一些操作了。`Mode`是渲染模式,支持三种模式,和Vditor(JavaScript)版本是一样的。`Toolbar`是自定义的工具栏,请看代码理解,也可以不自定义,这个Toolbar可以不用赋值。`OnToolBarButtonClick`是一个回调函数,当点击Toolbar之后的回调。`@bind-Value`是双向绑定,绑定用户输入到MarkDown的内如,是一个字符串,注意,需要使用@bind-,因为这样才是双向绑定。配置`Upload`是在用户在MarkDown中添加图片,或者DOCX的时候,将资源文件返回给服务器,然后服务器响应数据再回给我们,最后显示在MarkDown中。
我们还可以使用很多回调,比如获得焦点啥的,具体请看Vditor的API:https://ld246.com/article/1549638745630
## 后端DotNet实现Upload:
```csharp
[Route("api")]
public class ValuesController : ApiController
{
[HttpPost("upload")]
public async Task PostUrl()
{
if (Request.Content.IsMimeMultipartContent())
{
string root = System.IO.Path.Combine(Environment.CurrentDirectory, "wwwroot"); //<==Change Content Path
var provider = new MultipartFormDataStreamProvider(root);
await Request.Content.ReadAsMultipartAsync(provider);
Dictionary dict = new Dictionary(); //<==Use A dictionary To differ pictures in vditor upload
foreach (var file in provider.FileData)
{
string filename = file.Headers.ContentDisposition.FileName.Trim('"');
System.IO.FileInfo info = new System.IO.FileInfo(file.LocalFileName);
string savepath = System.IO.Path.Combine(root, filename);
if (!System.IO.File.Exists(savepath))
{
//<== Skip File If Exists
info.MoveTo(savepath);
}
dict.Add(filename, "api/image/" + filename);
}
return new JsonResult(new
{
Msg = "",
Code = 0,
Data = new { SuccMap = dict }
});
}
return new JsonResult(new
{
Msg = "错误",
Code = -1000,
Data = new { }
});
}
[HttpGet("image/{id}")]
public IActionResult GetImage(string id)
{
string path = System.IO.Path.Combine(Environment.CurrentDirectory, "wwwroot", id);
if (System.IO.File.Exists(path))
{
return new PhysicalFileResult(path, "image/png"); //<==Change Media Content Type
}
else
{
return NotFound();
}
}
}
```
负责上传与获取文件。