簡體   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