繁体   English   中英

Play Framework 2.3.4-如何在POST请求上调用Results.badRequest()并直接定向到未通过路由映射的控制器中的方法?

[英]Play Framework 2.3.4 - How to call Results.badRequest() on a POST request and direct to method in controller not mapped by routes?

好的,我的标题有点难以理解。

我要实现的目标如下。

我的控制器:

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()

我要避免做的是重复很多不必要的代码来获取postFromSomeForm()方法下的someObjectsomeOtherObject对象。

我知道我可以将// Do complicated stuff to get someObject and someOtherObject表示的位移到另一个方法中// Do complicated stuff to get someObject and someOtherObject ,但是由于这两个对象的性质,它并不简单。

如果重命名(似乎不允许使用重载的方法addSomething(Form<SomeFormDetails> someForm) ,则可以将addSomething(Form<SomeFormDetails> someForm)到路由中,但这不是可取的,因为这会导致很多其他问题。

我不能简单地将重要的部分更改为:

return badRequest(com.me.controllers.Get.addSomething.render(filledForm));

因为不支持此操作(即不使用reverseGet)。 仅供参考, The method badRequest(Content) in the type Results is not applicable for the arguments (Result)

我很确定我正在尝试实现一些简单的操作,但是在使用该框架时并没有一个简单的方法来实现它,因为从路由生成的所有reverseGet位与控制器方法的返回类型都不相同(我当然知道是这样,并且知道这是必需的)

有人可以让我知道是否有一种简单的支持方法来实现我要实现的目标吗? 如果这个问题没有道理,请告诉我。

您可以实现使该操作返回渲染的模板而不是结果的结果:

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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM