#c# #razor #asp.net-core-mvc
Вопрос:
Надеюсь, моя проблема несколько проста. Используя ASP.NET Ядро MVC и Visual Studio.
У меня есть база данных, в которой будет храниться cshtml. Я буду читать это в свойство модели в верхней части index.cshtml
файла.
Для определенных разделов мне нужно отобразить этот cshtml так, как он отображался бы, если бы он был у меня только в файле cshtml для начала.
Использование этого работает, В ОСНОВНОМ —> @Html.Raw(Model.htmlcontent)
Однако все @Model.Property
биты отображаются таким образом, вместо того, чтобы фактически вставлять значение, как я хочу.
Есть ли другой метод, такой как Html.Raw, который может это сделать, или хороший подход для этого?
Спасибо
Ответ №1:
Вы сохранили представление razor в базе данных, поэтому вам нужно сначала скомпилировать код razor в фактический html-код, а затем использовать @Html.Raw() для отображения html-кода со стилем.
Если вы просто хотите отобразить свойство модели, вы можете использовать библиотеку RazorEngineCore, которая поддерживает только .net 5:
public class RazorModel
{
public string htmlcontent { get; set; }
}
public class TestModel
{
public string Name { get; set; }
public int[] Items { get; set; }
}
Вид:
@model RazorModel
@Html.Raw(Model.htmlcontent)
Контроллер:
[HttpGet]
public IActionResult Index()
{
IRazorEngine razorEngine = new RazorEngine();
string templateText = "<h1>Hello @Model.Name<h1> <table>@foreach (var item in Model.Items) {<tr>@item</tr>}</table>";
IRazorEngineCompiledTemplate<RazorEngineTemplateBase<TestModel>> template = razorEngine.Compile<RazorEngineTemplateBase<TestModel>>(templateText);
var model = new RazorModel();
model.htmlcontent = template.Run(instance =>
{
instance.Model = new TestModel()
{
Name = "Rena",
Items = new[] { 3, 1, 2 }
};
});
return View(model);
}
Если вы используете asp.net core 3.x или любую другую версию вы можете установить RazorEngine.Библиотека NETCore и следуйте документу:
[HttpGet]
public IActionResult Index()
{
var model = new RazorModel();
string template = "<h1>Hello @Model.Name<h1> <table>@foreach (var item in Model.Items) {<tr>@item</tr>}</table>";
model.htmlcontent =
Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" , Items = new[] { 3, 1, 2 } });
return View(model);
}