Рендеринг Tag Helper HTML из строки

У нас есть много помощников по тегам, и мы стремимся позволить другим разработчикам создавать страницы с помощью редактора кода, где они пишут некоторый помощник по тегам, и после отправки мы хотим отобразить вывод. Мы хотим создать что-то вроде 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>

Вещи могут стать действительно сложными, как вы можете себе представить.

Есть ли способ визуализации Tag Helper из строки, которая приходит из контроллера MVC?

Я пытался визуализировать частичные представления и просматривать компоненты в виде строки. Но не повезло. Я пытался с помощью Html.Raw() с кодированием и декодированием, но не помогло.

Есть идеи?

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

Выполнение кода

Другие вопросы по тегам