我的一些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'很好,但是如果我可以定义这个模板的话,那就完美了:) –