如果我有一个动作Application.show(tag: String)
,并且还有相应的路由条目,如何在不手动制作网址的情况下将此操作的链接插入模板?
我想做magiclink(Application.show("tag"))
之类的事情。
答案 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
注释,这看起来确实是一个非常奇怪的错误。如果您正确构建项目,它可能会让您怀疑。确定真正的原因可能会使你付出相当大的血液和财富。