Scala 播放框架模板无法转义URL

Scala 播放框架模板无法转义URL,scala,templates,playframework,playframework-2.0,template-engine,Scala,Templates,Playframework,Playframework 2.0,Template Engine,我有一个播放模板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=

我有一个播放模板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>
}
当我渲染它时,我得到

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

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

...

*将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>
    ...
}
*请注意,“@uniqueId\u带引号()”扩展为“Html”(\”+(MyID)+“\”+scala.util.Random.nextInt.toString+“\”)”。我希望它实际执行字符串连接*

@(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>
    ...
}

此外,这应该是显而易见的,但我希望每个链接和附带的jquery都使用该链接唯一的ID呈现,并且我不希望控制器需要担心分配这些唯一ID。我这样做的方法是在每个id后面附加一个随机数(尽管视图最好有一个计数)。我需要在视图中具有这种有状态行为,因为我需要“dynamicLink”对控制器完全透明。

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

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

我找到了解决办法。您必须传递一个调用对象

    @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 =>
    ... 
    }
}

^现在它工作了。

将Html更改为字符串不起作用。另外,我不知道什么时候应该使用Html,什么时候应该使用字符串(在用户表单之外,总是使用字符串只是为了保护注入)
    @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 =>
    ... 
    }
}