我们有很多标签助手,并希望允许其他开发人员尝试通过代码编辑器创建页面,他们在其中编写一些标签助手,并在提交时呈现输出。我们想创建类似 w3 的东西

以 asp.net 文档中的最小示例为例,如下所示:

    public class EmailTagHelper : TagHelper
    {
        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "a";
        }
    }

当用户编写时,我们有一个代码编辑器:
<email>[email protected]<email>

我想执行这个标签助手并从中渲染 HTML 字符串,它应该是:
<a>[email protected]</a>

事情会变得非常复杂,正如您想象的那样。

有没有办法从来自 MVC Controller 的字符串呈现 Tag Helper?

我尝试将部分 View 和 View 组件渲染为字符串。但没有运气。我尝试使用 Html.Raw() 进行编码和解码,但也没有帮助。

有任何想法吗?

最佳答案

这是一个关于如何完成此操作的基本示例。让我们假设我们已经有了电子邮件标签助手。 AspNetCore 2.2

Startup.cs

ConfigureServices(IServiceCollection services) 中添加这段代码

services.Configure<RazorViewEngineOptions>(options =>
{
    options.AllowRecompilingViewsOnFileChange = true;
});

这允许 View 引擎检测文件更改并重新编译 View 。如果没有设置,除了 Development 之外的任何环境名称都将不起作用。

HomeController.cs
private readonly IHostingEnvironment _hostingEnvironment;
private readonly string _myTemplatePath;

public HomeController(IHostingEnvironment hostingEnvironment)
{
    _hostingEnvironment = hostingEnvironment;
    _myTemplatePath = Path.Combine(_hostingEnvironment.ContentRootPath, @"Views\Shared\_MyTemplate.cshtml");
}

public IActionResult Index()
{
    var myTemplateCode = System.IO.File.ReadAllText(_myTemplatePath);

    return View(new MyTemplateViewModel
    {
        TemplateCode = myTemplateCode
    });
}

[HttpPost]
public IActionResult UpdateMyTemplate(MyTemplateViewModel viewModel)
{
    System.IO.File.WriteAllText(_myTemplatePath, viewModel.TemplateCode);

    return RedirectToAction(nameof(Index));
}

public IActionResult GetMyTemplate()
{
    return View("_MyTemplate");
}

一些用于读取/写入 _MyTemplate.cshtml 文件的简单代码,这些代码将充当可编辑的代码位。

View /主页/Index.cshtml
<form asp-action="UpdateMyTemplate" method="post">
    <textarea asp-for="TemplateCode" rows="10"></textarea><br />
    <button type="submit">Save Changes</button>
</form>

<h2>Output</h2>
<partial name="_MyTemplate" />

运行代码

c# - 从字符串呈现标签助手 html-LMLPHP

10-08 18:08