播放框架模板无法转义URL

时间:2016-01-28 15:22:08

标签: scala templates playframework playframework-2.0 template-engine

我有这个Play模板,dynamicLink.scala.html ......

@( urlWithQuotes: Html, id: Html, toClick: Html )

@uniqueId_With_Quotes() = {
    Html("\"" + (@id) + "_" + scala.util.Random.nextInt.toString + "\"")
}

@defining(uniqueId_With_Quotes()) { uniqueID =>
    <a id=@uniqueID class="dynamicLink" href=@urlWithQuotes> @toClick </a>

    <script><!--Do stuff with dynamic link using jQuery--></script>
}

它与一些Javascript生成一个特殊的链接。我像这样渲染这个链接......

@dynamicLink(
    Html("@{routes.Controller.action()}"),
    Html("MyID"),
    Html("Click Me")
)

当我渲染它时,我得到......

<a id=
Html("\"" + (MyID) + "_" + scala.util.Random.nextInt.toString + "\"")
class="dynamicLink" href=@{routes.Controler.action()}> Click Me </a>

这不是我想呈现的内容。我想渲染这个......

<a id="MyID_31734697" class="dynamicLink" href="/path/to/controller/action"> Click Me </a>

如何正确转义此HTML?

*选择#2 - 用String *替换Html参数

@(urlWithQuotes: String, id: String, toClickOn: String)

@uniqueId_With_Quotes() = {
    Html("\"" + (@id) + "_" + scala.util.Random.nextInt.toString + "\"")
}

@defining(uniqueId_With_Quotes) { uniqueID =>
    <a id=@uniqueID class="dynamicLink" href=@urlWithQuotes> @toClickOn </a>
    ...
}

使用...

@dynamicLink2(
"@{routes.Controller.action()}",
"MyID",
"Click Me"
)

...呈现

    <a id=
    Html("\"" + (MyID) + "_" + scala.util.Random.nextInt.toString + "\"")
 class="dynamicLink" href=@{routes.Controller.action()}> Click Me </a>
    <script>
        ...
    </script>

*将Html更改为字符串不起作用*

*请注意&#34; @uniqueId_With_Quotes()&#34;扩展到&#34; Html(&#34; \&#34;&#34; +(MyID)+&#34; _&#34; + scala.util.Random.nextInt.toString +&#34; \&#34 ;&#34;)&#34;。我希望它实际上执行字符串连接。 *

此外,这应该是显而易见的,但我希望每个链接和随附的jquery都使用该链接唯一的ID进行呈现,并且我不希望控制器担心分配这些唯一ID和#39; S。我这样做的方法是在每个id上附加一个随机数(尽管视图可能更适合计数)。我需要在视图中有这种状态行为,因为我需要&#34; dynamicLink&#34;对控制器完全透明。

2 个答案:

答案 0 :(得分:0)

您是否尝试将变量用作字符串类型?

@( urlWithQuotes: String, id: String, toClick: String )

答案 1 :(得分:0)

我找到了解决方案。你必须传递一个Call对象。

    @dynamicLink(
    ({routes.Controller.action()}),
    "MyID",
    "Click Me"
    )

将这些参数传递给......

@(urlNoQuotes: Call, id: String = "", toClickOn: String = "")

@uniqueId_With_Quotes() = @{
    Html("\"" + (id) + "_" + scala.util.Random.nextInt.toString + "\"")
}

@url() = @{
    Html("\"" + urlNoQuotes + "\"")
}

@defining( url() ) { processedURL =>
    @defining(uniqueId_With_Quotes()) { uniqueID =>
    ... 
    }
}

^现在可行。