【问题标题】:Print HTML in Scala template在 Scala 模板中打印 HTML
【发布时间】:2013-04-18 20:02:56
【问题描述】:

我需要使用最新的 Play Framework 2.1.1 消息、变量、简单的 for 循环等在 Scala 模板中打印一些原始 HTML。一切正常。但是如果我需要做一些逻辑并将原始 HTML 打印到模板中呢?

@{
    val courts = venue.getCourts()
    val totalWidth : Int = 920
    .. some other initialization variables/values

    var output : String = ""
    for(court <- courts) {
        output += "<p>SomeComplexString</p>"
    }

    output
}

在这种情况下,@{} 函数返回 output,但 HTML 被转义,而且它也不太实用(在返回之前将所有内容组合成单个 output 变量)。

如果我放类似的东西

for(court <- courts) {
    println("<p>SomeComplexString</p>")
}

它不工作(我没有收到任何编译错误,但没有任何输出)。

我可以的

@for(court <- courts) {
    <p>SomeComplexString</p>
}

但是courts 会超出范围(假设我不能在一开始就将courts 定义为模板变量)。

解决办法是什么?

【问题讨论】:

    标签: playframework-2.0 scala-template


    【解决方案1】:

    但是如果我需要做一些逻辑并将原始 HTML 打印到模板中呢?

    Play 框架与其他 MVC 框架一样,建议严格分离关注点。您的逻辑必须在您的控制器中,而不是在视图中。这就是为什么在 scala 模板中执行此操作相对复杂的原因。

    此外,您可以使用@Html() 来显示未转义的变量。

    【讨论】:

    • 正确答案但出于安全考虑避免使用@Html()
    • @adis 您能否具体说明@Html() 的安全问题?
    • @user1943442 如果您只是在用户输入中使用@Html,则脚本注入。阅读更多:wonko.com/post/html-escaping
    • @adis 啊,我以为我错过了什么。我认为避免使用 @Html() 是不好的建议。这是一个必要的功能。更好的建议是在应用于用户输入时意识到它的含义。
    • @user1943442 完全同意你的论点!
    猜你喜欢
    • 2015-01-18
    • 2012-05-07
    • 2019-06-29
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多