@elf-express/admin-net-mcp 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +83 -88
- package/knowledge/Furion_Teaching_Manual/04-1-/351/205/215/347/275/256.md +442 -0
- package/knowledge/Furion_Teaching_Manual/04-2-/351/201/270/351/240/205.md +363 -0
- package/knowledge/Furion_Teaching_Manual/05-1-/345/213/225/346/205/213WebAPI.md +825 -0
- package/knowledge/Furion_Teaching_Manual/05-2-HttpContext.md +217 -0
- package/knowledge/Furion_Teaching_Manual/05-3-/347/257/251/351/201/270/345/231/250/346/224/224/346/210/252/345/231/250AOP.md +581 -0
- package/knowledge/Furion_Teaching_Manual/05-4-/350/253/213/346/261/202/347/250/275/346/240/270/346/227/245/350/252/214.md +129 -0
- package/knowledge/Furion_Teaching_Manual/05-5-/344/270/255/344/273/213/350/273/237/351/253/224Middleware.md +328 -0
- package/knowledge/Furion_Teaching_Manual/05-6-Vue-React-Angular/344/273/213/351/235/242/344/273/243/347/220/206.md +317 -0
- package/knowledge/Furion_Teaching_Manual/06-1/350/246/217/347/257/204/345/214/226/346/216/245/345/217/243.md +1458 -0
- package/knowledge/Furion_Teaching_Manual/06-2/347/254/254/344/270/211/346/226/271API_Scalar.md +91 -0
- package/knowledge/Furion_Teaching_Manual/07-/345/217/213/345/245/275/344/276/213/345/244/226/350/231/225/347/220/206.md +511 -0
- package/knowledge/Furion_Teaching_Manual/08-1-/350/263/207/346/226/231/351/251/227/350/255/211/345/237/272/347/244/216/344/275/277/347/224/250.md +587 -0
- package/knowledge/Furion_Teaching_Manual/10-1-SqlSugar/346/225/264/345/220/210.md +336 -0
- package/knowledge/Furion_Teaching_Manual/11-SaaS /345/244/232/347/247/237/346/210/266/347/255/206/350/250/230.md" +271 -0
- package/knowledge/Furion_Teaching_Manual/12-furion-dependency-injection.md +408 -0
- package/knowledge/Furion_Teaching_Manual/13-/347/211/251/344/273/266/350/263/207/346/226/231/346/230/240/345/260/204/357/274/210Mapster/357/274/211.md +162 -0
- package/knowledge/Furion_Teaching_Manual/14-/345/210/206/345/270/203/345/274/217/347/274/223/345/255/230.md +311 -0
- package/knowledge/Furion_Teaching_Manual/15-/345/256/211/345/205/250/351/211/264/346/235/203.md +832 -0
- package/knowledge/Furion_Teaching_Manual/17-/346/252/242/350/246/226/347/257/204/346/234/254/345/274/225/346/223/216.md +327 -0
- package/knowledge/Furion_Teaching_Manual/18-/346/227/245/350/252/214/350/250/230/351/214/204.md +639 -0
- package/knowledge/Furion_Teaching_Manual/19-1-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/345/237/272/347/244/216/344/275/277/347/224/250.md +621 -0
- package/knowledge/Furion_Teaching_Manual/19-2-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/351/200/262/351/232/216/346/214/207/345/215/227.md +928 -0
- package/knowledge/Furion_Teaching_Manual/19-3-HTTP/351/201/240/347/253/257/350/253/213/346/261/202/345/270/270/350/246/213/345/225/217/351/241/214.md +362 -0
- package/knowledge/Furion_Teaching_Manual/20-/350/263/207/346/226/231/345/212/240/350/247/243/345/257/206.md +286 -0
- package/knowledge/Furion_Teaching_Manual/20-/351/231/204/351/214/204-KSort/350/263/207/346/226/231/347/260/275/345/220/215/345/256/214/346/225/264/345/216/237/345/247/213/347/242/274.md +305 -0
- package/knowledge/Furion_Teaching_Manual/21-/345/205/250/347/220/203/345/214/226/345/222/214/346/234/254/345/234/260/345/214/226.md +342 -0
- package/knowledge/Furion_Teaching_Manual/22-/344/272/213/344/273/266/345/214/257/346/265/201/346/216/222EventBus.md +448 -0
- package/knowledge/Furion_Teaching_Manual/23-JSON/345/272/217/345/210/227/345/214/226.md +340 -0
- package/knowledge/Furion_Teaching_Manual/24-/345/215/263/346/231/202/351/200/232/350/250/212SignalR.md +247 -0
- package/knowledge/Furion_Teaching_Manual/25-/350/274/224/345/212/251/350/247/222/350/211/262/346/234/215/345/213/231WorkerService.md +295 -0
- package/knowledge/Furion_Teaching_Manual/26-1-/346/216/222/347/250/213/344/275/234/346/245/255/345/256/232/346/231/202/344/273/273/345/213/231.md +631 -0
- package/knowledge/Furion_Teaching_Manual/26-2-Cron/350/241/250/351/201/224/345/274/217.md +203 -0
- package/knowledge/Furion_Teaching_Manual/26-3-/344/273/273/345/213/231/344/275/207/345/210/227TaskQueue.md +215 -0
- package/knowledge/Furion_Teaching_Manual/27-/345/210/206/346/225/243/345/274/217ID/347/224/237/346/210/220.md +86 -0
- package/knowledge/Furion_Teaching_Manual/28-/346/250/241/347/265/204/345/214/226/351/226/213/347/231/274.md +68 -0
- package/knowledge/Furion_Teaching_Manual/29-/346/265/201/350/256/212/347/211/251/344/273/266Clay.md +313 -0
- package/knowledge/Furion_Teaching_Manual/30-/350/204/253/346/225/217/350/231/225/347/220/206/357/274/210Sensitive Detection).md" +168 -0
- package/knowledge/Furion_Teaching_Manual/32-/346/234/203/350/251/261/345/222/214/347/213/200/346/205/213/347/256/241/347/220/206.md +147 -0
- package/knowledge/Furion_Teaching_Manual/33-IPC/347/250/213/345/272/217/351/200/232/350/250/212.md +98 -0
- package/knowledge/Furion_Teaching_Manual/34-2-Docker/351/203/250/347/275/262.md +313 -0
- package/knowledge/Furion_Teaching_Manual/34-3-Nginx/351/203/250/347/275/262.md +157 -0
- package/knowledge/Furion_Teaching_Manual/34-8-WindowsService/351/203/250/347/275/262.md +112 -0
- package/knowledge/Furion_Teaching_Manual/35-1-Docker/347/222/260/345/242/203/346/214/201/347/272/214/351/203/250/347/275/262Jenkins.md +169 -0
- package/knowledge/Furion_Teaching_Manual/36-1-/345/226/256/345/205/203/346/270/254/350/251/246/346/225/264/345/220/210/346/270/254/350/251/246.md +275 -0
- package/knowledge/Furion_Teaching_Manual/36-3-/345/237/272/346/272/226/346/270/254/350/251/246Benchmarking.md +80 -0
- package/knowledge/attributes.md +153 -0
- package/knowledge/config.md +147 -0
- package/knowledge/entity.md +115 -0
- package/knowledge/event.md +124 -0
- package/knowledge/plugin.md +136 -0
- package/knowledge/service.md +146 -0
- package/knowledge/sqlsugar.md +172 -0
- package/knowledge/vue-typescript.md +338 -0
- package/package.json +3 -2
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# 17. 檢視/範本引擎
|
|
2
|
+
|
|
3
|
+
## 17.1 關於檢視引擎
|
|
4
|
+
|
|
5
|
+
檢視引擎負責根據檢視範本建立 HTML。檢視通常是 HTML 和程式語言的某種混合,支援變數定義、方法呼叫及邏輯編寫。
|
|
6
|
+
|
|
7
|
+
在 Furion 框架中,底層整合了微軟提供的 Razor 檢視引擎元件並提供更加靈活方便的語法糖。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 17.2 檢視引擎作用
|
|
12
|
+
|
|
13
|
+
- 支援 ASP.NET Core 完整的 Razor 語法
|
|
14
|
+
- 根據不同的資料編譯範本產生不同的輸出
|
|
15
|
+
- 實現強大的外掛化機制
|
|
16
|
+
- 實現全站頁面靜態化
|
|
17
|
+
- 可以用作郵件範本、簡訊範本、優惠券資訊範本等
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 17.3 基礎使用
|
|
22
|
+
|
|
23
|
+
### 17.3.1 註冊服務
|
|
24
|
+
|
|
25
|
+
```csharp
|
|
26
|
+
public void ConfigureServices(IServiceCollection services)
|
|
27
|
+
{
|
|
28
|
+
services.AddViewEngine();
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 17.3.2 使用方式
|
|
33
|
+
|
|
34
|
+
**建構函式注入 `IViewEngine`:**
|
|
35
|
+
|
|
36
|
+
```csharp
|
|
37
|
+
using Furion.DynamicApiController;
|
|
38
|
+
using Furion.ViewEngine;
|
|
39
|
+
|
|
40
|
+
namespace Furion.Application
|
|
41
|
+
{
|
|
42
|
+
public class ViewEngineService : IDynamicApiController
|
|
43
|
+
{
|
|
44
|
+
private readonly IViewEngine _viewEngine;
|
|
45
|
+
|
|
46
|
+
public ViewEngineService(IViewEngine viewEngine)
|
|
47
|
+
{
|
|
48
|
+
_viewEngine = viewEngine;
|
|
49
|
+
var result = _viewEngine.RunCompile("Hello @Model.Name", new { Name = "Furion" });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**字串方式:**
|
|
56
|
+
|
|
57
|
+
```csharp
|
|
58
|
+
var result = "Hello @Model.Name".RunCompile(new { Name = "Furion" });
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 17.3.3 弱型別範本
|
|
62
|
+
|
|
63
|
+
```csharp
|
|
64
|
+
var result = _viewEngine.RunCompile("Hello @Model.Name", new { Name = "Furion" });
|
|
65
|
+
// 結果:Hello Furion
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
> 支援非同步 `RunCompileAsync`。
|
|
69
|
+
|
|
70
|
+
### 17.3.4 強型別範本
|
|
71
|
+
|
|
72
|
+
```csharp
|
|
73
|
+
namespace YourProject; // Furion 4.8.4.16+ 支援無命名空間寫法
|
|
74
|
+
|
|
75
|
+
public class TestModel
|
|
76
|
+
{
|
|
77
|
+
public string Name { get; set; }
|
|
78
|
+
public int[] Items { get; set; }
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
```csharp
|
|
83
|
+
var result = _viewEngine.RunCompile(@"
|
|
84
|
+
Hello @Model.Name
|
|
85
|
+
@foreach(var item in Model.Items)
|
|
86
|
+
{
|
|
87
|
+
<p>@item</p>
|
|
88
|
+
}
|
|
89
|
+
", new TestModel // Furion 4.8.4.16+ 支援匿名型別
|
|
90
|
+
{
|
|
91
|
+
Name = "Furion",
|
|
92
|
+
Items = new[] { 3, 1, 2 }
|
|
93
|
+
});
|
|
94
|
+
// 結果:Hello Furion <p>3</p> <p>1</p> <p>2</p>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
> 支援非同步 `RunCompileAsync`。
|
|
98
|
+
|
|
99
|
+
### 17.3.5 高效能範本快取 🥇
|
|
100
|
+
|
|
101
|
+
由於範本編譯需要消耗大量的效能,建議使用帶 `FromCached` 結尾的 `RunCompileFromCached` 替代。呼叫該方法後會自動將範本編譯成 `.dll` 以便下次使用,減少第二次之後使用範本的效能損耗。
|
|
102
|
+
|
|
103
|
+
```csharp
|
|
104
|
+
var result = _viewEngine.RunCompileFromCached(@"
|
|
105
|
+
Hello @Model.Name
|
|
106
|
+
@foreach(var item in Model.Items)
|
|
107
|
+
{
|
|
108
|
+
<p>@item</p>
|
|
109
|
+
}
|
|
110
|
+
", new TestModel
|
|
111
|
+
{
|
|
112
|
+
Name = "Furion",
|
|
113
|
+
Items = new[] { 3, 1, 2 }
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
呼叫 `RunCompileFromCached` 方法之後將會使用 MD5 加密範本並產生 `.dll` 存放在網站根目錄下的 `templates` 目錄中。只要範本內容不變,資料發生改變也不會重新編譯範本,大幅提升首次之後的效能。
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 17.4 進階用法
|
|
122
|
+
|
|
123
|
+
進階用法支援將特定程式集、特定命名空間、特定型別引入到範本中使用。
|
|
124
|
+
|
|
125
|
+
### 17.4.1 新增程式集
|
|
126
|
+
|
|
127
|
+
```csharp
|
|
128
|
+
var result = _viewEngine.RunCompileFromCached(
|
|
129
|
+
@"<div>@System.IO.Path.Combine(""Furion"", ""ViewEngine"")</div>",
|
|
130
|
+
builderAction: builder =>
|
|
131
|
+
{
|
|
132
|
+
builder.AddAssemblyReferenceByName("System.IO");
|
|
133
|
+
});
|
|
134
|
+
// 結果:<div>Furion\\ViewEngine</div>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
多種方式載入程式集:
|
|
138
|
+
|
|
139
|
+
```csharp
|
|
140
|
+
builder.AddAssemblyReferenceByName("System.Security"); // 透過名稱
|
|
141
|
+
builder.AddAssemblyReference(typeof(System.IO.File)); // 透過型別
|
|
142
|
+
builder.AddAssemblyReference(Assembly.Load("source")); // 透過中繼資料參考
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 17.4.2 新增命名空間
|
|
146
|
+
|
|
147
|
+
```csharp
|
|
148
|
+
var result = _viewEngine.RunCompileFromCached(
|
|
149
|
+
@"<div>@Path.Combine(""Furion"", ""ViewEngine"")</div>",
|
|
150
|
+
builderAction: builder =>
|
|
151
|
+
{
|
|
152
|
+
builder.AddUsing("System.IO");
|
|
153
|
+
builder.AddAssemblyReferenceByName("System.IO");
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
也支援加入多個 `using`:
|
|
158
|
+
|
|
159
|
+
```csharp
|
|
160
|
+
builder.AddUsing("System.IO");
|
|
161
|
+
builder.AddUsing("Furion");
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 17.4.3 定義範本方法
|
|
165
|
+
|
|
166
|
+
```csharp
|
|
167
|
+
var result = _viewEngine.RunCompileFromCached(@"
|
|
168
|
+
<area>
|
|
169
|
+
@{ RecursionTest(3); }
|
|
170
|
+
</area>
|
|
171
|
+
|
|
172
|
+
@{
|
|
173
|
+
void RecursionTest(int level)
|
|
174
|
+
{
|
|
175
|
+
if (level <= 0) return;
|
|
176
|
+
|
|
177
|
+
<div>LEVEL: @level</div>
|
|
178
|
+
@{ RecursionTest(level - 1); }
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
");
|
|
182
|
+
// 結果:
|
|
183
|
+
// <div>LEVEL: 3</div>
|
|
184
|
+
// <div>LEVEL: 2</div>
|
|
185
|
+
// <div>LEVEL: 1</div>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 17.4.4 呼叫類別方法
|
|
189
|
+
|
|
190
|
+
定義 `CustomModel` 類別並繼承 `ViewEngineModel` 基底類別:
|
|
191
|
+
|
|
192
|
+
```csharp
|
|
193
|
+
public class CustomModel : ViewEngineModel
|
|
194
|
+
{
|
|
195
|
+
public int A { get; set; }
|
|
196
|
+
public string B { get; set; }
|
|
197
|
+
|
|
198
|
+
public string Decorator(object value)
|
|
199
|
+
{
|
|
200
|
+
return "-=" + value + "=-";
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
在範本中呼叫 `Decorator(value)` 方法:
|
|
206
|
+
|
|
207
|
+
```csharp
|
|
208
|
+
var content = @"Hello @A, @B, @Decorator(123)";
|
|
209
|
+
|
|
210
|
+
var template = _viewEngine.Compile<CustomModel>(content);
|
|
211
|
+
|
|
212
|
+
var result = template.Run(instance =>
|
|
213
|
+
{
|
|
214
|
+
instance.A = 10;
|
|
215
|
+
instance.B = "Alex";
|
|
216
|
+
});
|
|
217
|
+
// 結果:Hello 10, Alex, -=123=-
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 17.5 特殊字元處理
|
|
223
|
+
|
|
224
|
+
如有特殊符號如 `<`、`<>`、`&` 等,可透過 `@("<")` 或 `@('<')` 進行原樣輸出:
|
|
225
|
+
|
|
226
|
+
```csharp
|
|
227
|
+
var str = "bool value = 1 @('<') 2"; // 源字串為:bool value = 1 < 2;
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 17.6 字串範本替換引擎
|
|
233
|
+
|
|
234
|
+
Furion 除了內建檢視引擎之外,還支援以下幾種範本替換:
|
|
235
|
+
|
|
236
|
+
```csharp
|
|
237
|
+
// 提供資料範本方式
|
|
238
|
+
var str = "我叫{name}".Render(new Dictionary{ {"name", "Furion"} });
|
|
239
|
+
var str = "我叫{Name}".Render(new { Name = "Furion" });
|
|
240
|
+
var str = "我叫{Detail.Name}".Render(new { Detail = new { Name = "Furion" } });
|
|
241
|
+
|
|
242
|
+
// 從設定讀取方式
|
|
243
|
+
var str = "我叫#(Furion:Address)".Render();
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
對應設定檔:
|
|
247
|
+
|
|
248
|
+
```json
|
|
249
|
+
{
|
|
250
|
+
"Furion": {
|
|
251
|
+
"Address": "https://furion.net"
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## 17.7 格式化規範範本
|
|
259
|
+
|
|
260
|
+
在 Furion v3.5.3+ 新增了 `TP.Wrapper(...)` 規範範本:
|
|
261
|
+
|
|
262
|
+
```csharp
|
|
263
|
+
var template = TP.Wrapper("Furion 框架", "讓 .NET 開發更簡單,更通用,更流行。",
|
|
264
|
+
"##作者## 百小僧",
|
|
265
|
+
"##當前版本## v3.5.3",
|
|
266
|
+
"##文件位址## https://furion.net",
|
|
267
|
+
"##Copyright## 百小僧及百簽科技(廣東)有限公司");
|
|
268
|
+
|
|
269
|
+
Console.WriteLine(template);
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
輸出:
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
┏━━━━━━━━━━━ Furion 框架 ━━━━━━━━━━━
|
|
276
|
+
┣ 讓 .NET 開發更簡單,更通用,更流行。
|
|
277
|
+
┣
|
|
278
|
+
┣ 作者: 百小僧
|
|
279
|
+
┣ 當前版本: v3.5.3
|
|
280
|
+
┣ 文件位址: https://furion.net
|
|
281
|
+
┣ Copyright: 百小僧及百簽科技(廣東)有限公司
|
|
282
|
+
┗━━━━━━━━━━━ Furion 框架 ━━━━━━━━━━━
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
> **關於屬性產生**:如果列表項以 `##屬性名##` 開頭,自動產生 `屬性名:` 作為行首且自動等寬對齊。Furion 3.9.1 之前版本使用 `[屬性名]` 開頭。
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## 17.8 產生矩形日誌範本
|
|
290
|
+
|
|
291
|
+
> **版本說明**:僅限 Furion 4.8.8.25+ 版本使用。
|
|
292
|
+
|
|
293
|
+
```csharp
|
|
294
|
+
var template = TP.WrapperRectangle(new[] {
|
|
295
|
+
"百小僧",
|
|
296
|
+
"讓 .NET 開發更簡單,更通用,更流行。",
|
|
297
|
+
"一個應用程式框架,您可以將它整合到任何 .NET/C# 應用程式中。"
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
Console.WriteLine(template);
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
輸出:
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
+-----------------------------------------------------------------------------+
|
|
307
|
+
| 百小僧 |
|
|
308
|
+
| 讓 .NET 開發更簡單,更通用,更流行。 |
|
|
309
|
+
| 一個應用程式框架,您可以將它整合到任何 .NET/C# 應用程式中。 |
|
|
310
|
+
+-----------------------------------------------------------------------------+
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
還可以設定對齊方式:
|
|
314
|
+
|
|
315
|
+
```csharp
|
|
316
|
+
// 左對齊
|
|
317
|
+
var template = TP.WrapperRectangle(texts, -1);
|
|
318
|
+
|
|
319
|
+
// 置中對齊(預設)
|
|
320
|
+
var template = TP.WrapperRectangle(texts, 0);
|
|
321
|
+
|
|
322
|
+
// 右對齊
|
|
323
|
+
var template = TP.WrapperRectangle(texts, 1);
|
|
324
|
+
|
|
325
|
+
// 設定最長字串的追加長度
|
|
326
|
+
var template = TP.WrapperRectangle(texts, 1, 20); // 最長字串長度 + 20
|
|
327
|
+
```
|