好的,我的标题有点难以理解。
我想要实现的目标如下。
我的控制器:
public static Result addSomething() {
return getSomething(SOME_FORM);
}
public static Result addSomething(Form<SomeFormDetails> someForm) {
// Do complicated stuff to get someObject and someOtherObject
return ok(com.me.views.html.pages.AddSomething
.render(someObject, someOtherObject, someForm));
}
public static Result postFromSomeForm() {
Form<SomeFormDetails> filledForm = SOME_FORM.bindFromRequest();
SomeFormDetails details = filledForm.get();
// do some checks
if (Database.addStuff(details)) {
return redirect(com.me.controllers.routes.Get.index());
} else {
// #### THIS IS THE IMPORTANT BIT ####
// this next line is not possible as I do not have the
// method addSomething(Form<SomeFormDetails> someForm) mapped
// in routes, but you get what I mean
return badRequest(com.me.controllers.routes.Get.addSomething
.render(filledForm));
// #### THIS IS THE IMPORTANT BIT ####
}
}
路由
GET /something com.me.controllers.Get.addSomething()
POST /something/add com.me.controllers.Get.postFromSomeForm()
我想避免做的是重复使用大量不必要的代码来获取someObject
方法下的someOtherObject
和postFromSomeForm()
个对象。
我知道我可以将// Do complicated stuff to get someObject and someOtherObject
表示的位移动到另一个方法中,但由于这两个对象的性质并不简单。
我可以将addSomething(Form<SomeFormDetails> someForm)
添加到路线中,如果我重命名(似乎不允许重载方法),但这不可取,因为它会导致很多其他问题。
我不能简单地将重要的位改为:
return badRequest(com.me.controllers.Get.addSomething.render(filledForm));
因为不支持(即没有使用reverseGet)。仅供参考{@ 1}}。
我非常确定我正在努力实现一些简单的事情,但是在使用这个框架时,由于从没有路由生成的所有reverseGet位,所以没有一个简单的方法可以实现它。与控制器方法相同的返回类型(我知道当然是这种情况并且理解它是必需的)
如果有一种简单的支持方式来实现我想要实现的目标,任何人都可以告诉我吗?如果这个问题没有意义,请告诉我。
答案 0 :(得分:0)
您可以实现您想要的操作,只需使该操作返回渲染的模板而不是结果:
public static String addSomething(Form<SomeFormDetails> someForm) {
// Do complicated stuff to get someObject and someOtherObject
return com.me.views.html.pages.AddSomething
.render(someObject, someOtherObject, someForm).body();
}
// latter
return badRequest(com.me.controllers.routes.Get.addSomething.render(filledForm));