如何制作适用于HTML和HTML的视图? Ajax请求?

时间:2011-08-29 18:01:31

标签: ajax request playframework

我的一些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请求?

你好吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

最好使用内容类型。它允许您使用单个控制器,并具有多个Temaplates,以便以各种格式输出。在我的书中,我使用标准HTML页面和RSS页面作为同一控制器操作和相关模型数据的两个视图。

Play文档很好地解释了如何使用它。 http://www.playframework.org/documentation/1.2.3/routes#content-types

基本上,您可以以编程方式或在路由文件中执行此操作,或者允许播放通过Http请求类型按内容类型进行计算。通过专门设置JSON作为内容类型,在您的ajax请求中设置了后者。这应该是直截了当的,特别是如果您使用jquery来处理Ajax请求。