【发布时间】:2012-09-16 14:12:31
【问题描述】:
如果我有一个动作Application.show(tag: String),并且也有一个相应的路由条目,如何在不手动制作网址的情况下将该动作的链接插入到模板?
我想做magiclink(Application.show("tag"))之类的事情。
【问题讨论】:
标签: templates hyperlink playframework-2.0
如果我有一个动作Application.show(tag: String),并且也有一个相应的路由条目,如何在不手动制作网址的情况下将该动作的链接插入到模板?
我想做magiclink(Application.show("tag"))之类的事情。
【问题讨论】:
标签: templates hyperlink playframework-2.0
语法:
<a href='@routes.Application.show("some")'>My link with some string</a>
以此类推,您也可以在控制器中生成 url。 IE。用于在某些操作后重定向:
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"));
}
【讨论】:
将routes 文件中的 URL 放入 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")。
我希望这个答案更清楚易懂。
【讨论】:
com.mycompany.myproduct.controllers.LoginController.index()
啊,就这么简单@{routes.Application.show("tag")}。
【讨论】:
公认的答案是对的,但不包括控制器在子包中的情况,即: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 注释,这看起来确实是一个非常奇怪的错误。它可能会让您质疑您是否正确构建了项目。确定真正的原因可能会让您付出大量的鲜血和财宝。
【讨论】: