How to insert link to controller action in Play framework 2.0 template

前提是你 提交于 2019-12-08 15:00:56

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!