> For the complete documentation index, see [llms.txt](https://monksoul.gitbook.io/hoa/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://monksoul.gitbook.io/hoa/qitagongneng/razorshituyingqing.md).

# 23.3、Razor 视图引擎

强大的视图引擎给模板页面定制提供了可能性。

## 视图引擎

自.NET Framework开始，在ASP.NET MVC框架中就引入了 `RazorEngine` ，也就是视图引擎，通常我们的视图是采用 `.cshtml` 文件进行编写。

由于我们是前后端分离的 `WebAP`I 项目，所以并没有引入完整的 `asp.net core mvc` 框架，所以，今天在 `Hoa` 框架中集成 `RazorEngine` 功能

## 简单入门

### **非强类型**

```csharp
var templateText = @"Hello @Model.Name.";
var result = RazorEngineHelper.RunCompile(templateText, new { Name = "Hoa" }); // => Hello Hoa.
```

**由于编辑模板需要付出昂贵的性能代价，所以 `Hoa` 框架只在首次编译模板后就将模板缓存起来并生成 `.dll`文件。这样就无需担心后续性能问题了。**

### **强类型模型**

```csharp
var templateText = @"Hello @Model.Name.";
var result = RazorEngineHelper.RunCompile<Model>(templateText, new Model{ Name = "Hoa" }); // => Hello Hoa.
```

### **加载`.cshtml`文件**

```csharp
// 非强类型
var cshtmlPath = "你的.cshtml完整路径";
var result = RazorEngineHelper.RunCompileViewPath(cshtmlPath, new { Name = "Hoa" }); // => Hello Hoa.

// 强类型
var result = RazorEngineHelper.RunCompileViewPath<Model>(cshtmlPath, new Model{ Name = "Hoa" }); // => Hello Hoa.
```

## 高级入门

Hoa 内置的 `Razor 视图引擎` 支持完整的 ASP.NET Core 3.x 语法，比如

### **自定义方法**

```markup
<area>
    @{ RecursionTest(3); }
</area>

@{
  void RecursionTest(int level)
  {
    if (level <= 0)
    {
        return;
    }

    <div>LEVEL: @level</div>
    @{ RecursionTest(level - 1); }
  }
}
```

### **强类型方法调用**

#### 模板定义

```markup
Hello @A, @B, @Decorator(123)
```

#### 强类型模型

```markup
public class CustomModel
{
    public int A { get; set; }
    public string B { get; set; }

    public string Decorator(object value)
    {
        return "-=" + value + "=-";
    }
}
```

#### 编译模板

```csharp
var result = RazorEngineHelper.RunCompile<CustomModel>(templateText, u => {
    u.A = 10,
    u.B = "Hoa"
});
```

### **引入程序集**

#### 模板定义

```markup
@using System.IO

<div>@Model.Name</div>
<div>@Path.GetFullPath("~/Views/Home.cshtml")</div>
```

### 编译模板

```csharp
var result = RazorEngineHelper.RunCompile(templateText
                            , new { Name = "Hoa" }
                            ,typeof(System.IO.Path));
```

更多关于RazorEngineCore [可查看官方文档](https://github.com/adoconnection/RazorEngineCore)。
