我的一些Play框架視圖將接受普通請求(通過鏈接GET)和ajax請求(如果用戶啓用了js,則從javascript代碼調用)。您如何製作既能處理HTML又能處理Ajax請求的視圖?
我實際的問題是,我的代碼會在相同的方法兩種可能性,這樣的事情:
public static void lostPassword() {
HashMap<String, Object> ajax = new HashMap<String, Object>();
validation.clear();
validation.required("email", params.get("email"));
validation.email("email", params.get("email"));
if (!validation.hasErrors()) {
Account account = Account.findAccount(params.get("email"));
if (account != null) {
// Send the email:
Mails.lostPassword(account);
if (request.isAjax()) {
ajax.put("success", true);
renderJSON(ajax);
}
else {
renderTemplate("account/password/sent.html");
}
}
validation.addError("email", "This email does not exists."); // TRANS
}
if (request.isAjax()) {
ajax.put("success", false);
ajax.put("validation", AjaxUtils.fromValidationErrorsToAjax(validation.errors()));
renderJSON(ajax);
}
else {
validation.keep();
renderArgs.put("email", params.get("email"));
renderTemplate("account/password/form.html");
}
}
正如你所看到的,我檢查其中的請求類型返回一個適當的做反應,我相信這不是做這件事的最好方法。
但你會怎麼做?
我想過要做一個私有方法來完成工作並返回一個布爾值,但是驗證對象會發生什麼?這是否意味着我將不得不製作另外兩個方法,一個用於HTML請求,另一個用於AJAX請求?
你好嗎?
感謝您的幫助!
有趣的工作方式,但我使用renderHTemplate的Html。如何通過指定模板來使用'render'? –
在你的控制器中,你可以訪問'request.format'變量,然後你可以用它來指定正確的路由。它比使用renderTemplate方法更具代碼性,但它可能適合您的需求。 – Codemwnci
如果我理解正確,那麼將測試request.isAjax(我可以處理更多格式)。我想要做的是減少代碼量,主要是(太多)'request.isAjax()'測試。你的'render'很好,但是如果我可以定義這個模板的話,那就完美了:) –