Как отобразить Cshtml из свойства модели? ASP NET Core MVC

#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);
}