使用MVC呈现包含Razor变量的动态HTML

7

我有一些编码的Html,其中嵌入了无数个不同的Razor变量,我已经将其存储并需要从数据库中检索出来。我想在MVC/razor视图中呈现它。

这里是数据库中保存的一个简单示例Html(它可能更复杂):

"<span>Your page is @Config.PageColour and you have page size of @Config.PageSize</span>"

MessageController.cs

public ActionResult ShowMessage()
{
    var htmlToDisplay = _messageDAL.getHtmlMessage();
    var messageVm = new MessageVm
    {
        DisplayMessage = htmlToDisplay;
    };

    return View("Index.cshtml", "", messageVm);
}

Index.cshtml

<html>
    @Html.Raw(@model.DisplayMessage)
</html>

结果

当我运行时,呈现的页面如下所示:

你的页面颜色为@Config.PageColour,页面大小为@Config.PageSize

但我希望它能解释Razor变量的值并与html块一起显示,应该像这样:

你的页面颜色为蓝色,页面大小为A4

真的卡在这里了,任何帮助都将不胜感激!

2个回答

8
使用这行代码。我希望这可以帮到您。
@Html.Raw(System.Web.HttpUtility.HtmlDecode(@model.DisplayMessage))

编辑 1

你可以使用任何 Razor 编译器,例如下面提到的这个

RazorEngine:

string result = RazorEngine.Razor.Parse(@model.DisplayMessage, new { Name = "Name" });

RazorEngine不支持任何Mvc助手,例如Html和Url。由于这些库应该存在于Mvc之外,因此需要更多的工作才能使它们与这些助手一起使用。
编辑2:
您可以使用允许您使用HTML模板的Razor编译器,称为RazorEngine,可以在https://github.com/Antaris/RazorEngine找到。
从Visual Studio中,使用包管理器控制台命令:
Install-Package RazorEngine

安装后,我按照以下方式更改了我的控制器:

MessageController.cs

public ActionResult ShowMessage()
{
    var htmlTemplate = _messageDAL.getHtmlMessage();

    var htmlToDisplay = Engine.Razor.RunCompile(htmlTemplate , "messageTemplateKey", null, new { Name = "some model data" });

    var messageVm = new MessageVm
    {
        DisplayMessage = htmlToDisplay;
    };

    return View("Index.cshtml", "", messageVm);
}

嗨,@Mukesh Kumar。我试过了,可惜好像没什么用。 - Jeff Yates
1
请检查已编辑的答案。希望能有所帮助。 - Mukesh Kumar
我不得不进行一些挖掘并进行了一些更改,但最终您的第二个答案提供了足够的信息,使我能够编写一个完整且可行的解决方案,我也已经发布了。谢谢@Mukesh Kumar。 - Jeff Yates
太好了。将其标记为答案,这可能会帮助其他人。如果需要进行其他更改,请编辑答案或让我知道,我会做出修改。 - Mukesh Kumar
没错,我用我的细节修改了你的答案。这样省了我很多工作。谢谢! - Jeff Yates
让我们在聊天中继续这个讨论:点击此处进入聊天室 - Mukesh Kumar

2

您可以使用一个名为 RazorEngine 的 Razor 编译器来使用 HTML 模板,该编译器可在 https://github.com/Antaris/RazorEngine 找到。

Visual Studio中,使用包管理器控制台命令:

Install-Package RazorEngine

安装后,我将控制器更改如下: MessageController.cs
public ActionResult ShowMessage()
{
    var htmlTemplate = _messageDAL.getHtmlMessage();

    var htmlToDisplay = Engine.Razor.RunCompile(htmlTemplate , "messageTemplateKey", null, new { Name = "some model data" });

    var messageVm = new MessageVm
    {
        DisplayMessage = htmlToDisplay;
    };

    return View("Index.cshtml", "", messageVm);
}

它第一次就成功了。非常感谢@Mukesh Kumar,他提供了重写代码所需的关键线索,我已经将完整且可行的答案发布在这里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接