问题
If I have an action Application.show(tag: String), and also have a corresponding routing entry, how can I insert a link to this action to a template without crafting the url manually?
I would like to do something like magiclink(Application.show("tag")).
回答1:
syntax:
<a href='@routes.Application.show("some")'>My link with some string</a>
By analogy you can also generate urls in your controllers. ie. for redirecting after some action:
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"));
}
回答2:
The format for putting a URL from your routes file in your html is as follow:
@routes.NameOfYourClass.nameOfyourMethod()
So, if in your routes file you have:
GET /products controllers.Products.index()
And your Products class looks like this:
public class Products extends Controller {
public Result index() {
return ok(views.html.index.render());
}
}
Your <a> should look like this:
<a href="@routes.Products.index()">Products</a>
In addition: If your method can accept parameters, then you can of course pass them in between the parenthesize of your method like this: index("Hi").
I hope this answer is more clear to understand.
回答3:
Ah, as simple as @{routes.Application.show("tag")}.
回答4:
The accepted answer is right, but it doesn't cover the case where the controller is in a sub-package, i.e.: controllers.applications.MyFavouriteApplication.show()
Since I had a hard time finding the answer, I'll post it here.
To put a non-scoped link into a template, the proper pattern is @controllers.{sub-packages if any}.routes.{your class}.{your method}()
So in this case it would be @controllers.applications.routes.MyFavouriteApplication.show()
IF you were using the recommended Play pattern of using @Inject to create singleton controller objects, and IF you thought the correct answer was @controllers.applications.MyFavouriteApplication.show(), you would get an error like this:
Object MyFavouriteApplication is not a member of controllers.applications. Note: class MyFavouriteApplication exists, but it has no companion object.
Given that you had already supplied the @Inject() @Singleton annotation, this would seem like a very strange error indeed. It might make you question if you were building the project correctly. Determining the true cause could cost you considerably in blood and treasure.
来源:https://stackoverflow.com/questions/12447567/how-to-insert-link-to-controller-action-in-play-framework-2-0-template