Рендеринг Tag Helper HTML из строки - PullRequest
0 голосов
/ 25 февраля 2019

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

0 голосов
/ 27 февраля 2019

Вот небольшой пример того, как этого добиться.Предположим, у нас уже есть помощник по меткам электронной почты.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" />

Запуск кода

enter image description here

...