【问题标题】:Rendering Tag Helper html from a string从字符串渲染标签助手 html
【发布时间】:2019-07-19 06:27:47
【问题描述】:

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

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

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

当用户编写代码时,我们有一个代码编辑器:

<email>foo@foo.com<email>

我想执行这个标签助手并从中渲染 HTML 字符串,应该是:

<a>foo@foo.com</a>

事情可能会变得非常复杂,如您所想。

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

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

有什么想法吗?

【问题讨论】:

  • 我关注this project 有一段时间了,但发展似乎很慢
  • 它与问题有什么关系?
  • 你想获取一个字符串并通过 razor 运行它以输出 html,是吗?
  • 不可能。标签助手必须出现在实际的 Razor 视图中。 @Shoe 引用的是一种以编程方式呈现字符串的方法,就好像它们是完整的 Razor 视图一样。这可能是一种潜在的解决方法,但您必须从根本上改变您的项目使用视图的方式。就使用标准 *.cshtml 文件而言,这是一个非首发。

标签: c# .net asp.net-core tag-helpers asp.net-core-tag-helpers


【解决方案1】:

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

Startup.cs

ConfigureServices(IServiceCollection services)添加这段代码

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

这允许视图引擎检测文件更改并重新编译视图。如果没有设置除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 文件的简单代码,这些代码将充当可编辑的代码。

Views/Home/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" />

运行代码

【讨论】:

  • 感谢您的详细解答。我会试一试的。
  • 这会极大地影响性能,这应该有条件地完成
猜你喜欢
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2019-11-26
  • 1970-01-01
  • 2015-07-16
  • 2021-11-14
相关资源
最近更新 更多