2011-08-29 53 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'很好,但是如果我可以定義這個模板的話,那就完美了:) –