Рендеринг 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" />
Выполнение кода