从字符串中呈现标签助手 html
Rendering Tag Helper html from a string
我们有很多标签助手,并希望允许其他开发人员尝试通过代码编辑器创建页面,他们在其中编写一些标签助手,并在提交后呈现输出。我们想创建类似 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()
进行编码和解码,但也没有帮助。
有什么想法吗?
这里有一个关于如何完成此操作的基本示例。让我们假设我们已经有了电子邮件标签助手。 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");
}
一些简单的代码 read/write 到 _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" />
运行代码
我们有很多标签助手,并希望允许其他开发人员尝试通过代码编辑器创建页面,他们在其中编写一些标签助手,并在提交后呈现输出。我们想创建类似 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()
进行编码和解码,但也没有帮助。
有什么想法吗?
这里有一个关于如何完成此操作的基本示例。让我们假设我们已经有了电子邮件标签助手。 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");
}
一些简单的代码 read/write 到 _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" />
运行代码