2011-08-29 30 views
2

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

你好吗?

感谢您的帮助!

回答

3

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

Play文档在解释如何使用它方面做得很好。 http://www.playframework.org/documentation/1.2.3/routes#content-types

基本上,您可以通过编程或在您的路线文件中,或通过允许播放通过Http请求类型的内容类型找出它。稍后通过专门设置JSON作为内容类型来设置您的ajax请求。这应该是直截了当的,特别是如果您使用jQuery来处理Ajax请求。

+0

有趣的工作方式,但我使用renderHTemplate的Html。如何通过指定模板来使用'render'? –

+0

在你的控制器中,你可以访问'request.format'变量,然后你可以用它来指定正确的路由。它比使用renderTemplate方法更具代码性,但它可能适合您的需求。 – Codemwnci

+0

如果我理解正确,那么将测试request.isAjax(我可以处理更多格式)。我想要做的是减少代码量,主要是(太多)'request.isAjax()'测试。你的'render'很好,但是如果我可以定义这个模板的话,那就完美了:) –