我的一些Play Framework视图将接受正常请求(通过链接获取GET)和ajax请求(如果用户启用了js,则从javascript代码调用)。
我的实际问题是我的代码在同一个方法中寻找两种可能性,如下所示:
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");
}
}
正如您所看到的,我检查了返回正确响应的请求类型,我确信这不是最好的方法。
但是你会怎么做?
我考虑过创建一个私有方法来完成工作并返回一个布尔值,但是Validation对象会发生什么?这是否意味着我必须制作另外两个方法,一个用于HTML请求,另一个用于AJAX请求?
你好吗?
感谢您的帮助!
答案 0 :(得分:3)
最好使用内容类型。它允许您使用单个控制器,并具有多个Temaplates,以便以各种格式输出。在我的书中,我使用标准HTML页面和RSS页面作为同一控制器操作和相关模型数据的两个视图。
Play文档很好地解释了如何使用它。 http://www.playframework.org/documentation/1.2.3/routes#content-types
基本上,您可以以编程方式或在路由文件中执行此操作,或者允许播放通过Http请求类型按内容类型进行计算。通过专门设置JSON作为内容类型,在您的ajax请求中设置了后者。这应该是直截了当的,特别是如果您使用jquery来处理Ajax请求。