如何在Play framework 2.0模板中插入控制器操作的链接

时间:2012-09-16 14:12:32

标签: templates hyperlink playframework-2.0

如果我有一个动作Application.show(tag: String),并且还有相应的路由条目,如何在不手动制作网址的情况下将此操作的链接插入模板?

我想做magiclink(Application.show("tag"))之类的事情。

4 个答案:

答案 0 :(得分:17)

语法:

<a href='@routes.Application.show("some")'>My link with some string</a>

通过类比,您还可以在控制器中生成网址。即。在某些行动后重定向:

public static Result justRedirect(){

    // use as String
    String urlOfShow = routes.Application.index().toString().

    // or pass as a redirect() arg
    return redirect(routes.Application.show("some"));
}

答案 1 :(得分:4)

将h routes文件中的网址放入html中的格式如下:

@routes.NameOfYourClass.nameOfyourMethod()

因此,如果您的routes文件中有:

GET     /products                   controllers.Products.index()

您的Products课程如下:

public class Products extends Controller {

    public Result index() {
        return ok(views.html.index.render());
    }
}

您的<a>应如下所示:

<a href="@routes.Products.index()">Products</a>

此外:如果您的方法可以接受参数,那么您当然可以在方法的括号之间传递它们,如下所示:index("Hi")

我希望这个答案能更清楚地理解。

答案 2 :(得分:3)

啊,就像@{routes.Application.show("tag")}一样简单。

答案 3 :(得分:2)

接受的答案是对的,但它不包括控制人在子包中的情况,即:controllers.applications.MyFavouriteApplication.show()

由于我很难找到答案,我会在这里发布。

要将非范围链接放入模板,正确的模式为@controllers.{sub-packages if any}.routes.{your class}.{your method}()

所以在这种情况下,它将是@controllers.applications.routes.MyFavouriteApplication.show()

如果您使用推荐的Play模式使用@Inject创建单例控制器对象,并且如果您认为正确的答案是@controllers.applications.MyFavouriteApplication.show(),则会出现如下错误:

Object MyFavouriteApplication is not a member of controllers.applications. Note: class MyFavouriteApplication exists, but it has no companion object.

鉴于您已经提供了@Inject() @Singleton注释,这看起来确实是一个非常奇怪的错误。如果您正确构建项目,它可能会让您怀疑。确定真正的原因可能会使你付出相当大的血液和财富。