2015-09-22 28 views
0

在我查找控制器的控制方法,我有一個方法,如:綁定一個HTML表單的行動,需要一些參數

public Result findLatest(String repoStr) { 
    ............ 
} 

這是通過路由鏈接:

GET  /latest      controllers.Find.findLatest(repo: String) 

然後,我在一個視圖中有一個窗體如下:

<form action="@routes.Find.findLatest()" method="get"> 
    .... 
    <select name="repo">....</select> 
</form> 

但顯然這是失敗的,因爲它期望我做的一些參數在行動中不履行。什麼是正確的方法來做到這一點,而不必離開findLatest方法在我的控制器中沒有參數?

回答

0

Cavice提出一些接近我認爲這樣做的最好的解決方案(因爲F.Option不使用默認的粘合劑不再支持在Play 2.1中)。

我最終離開的路線,如:

GET  /latest      controllers.Find.findLatest(repo=null) 

和類似的觀點:

<form action="@routes.Find.findLatest(null)" method="get"> 
    <select name="repo"> .... </select> 
.... 
</form> 

,並在控制器:

public Result findLatest(String repoStr) { 
    if(repoStr==null) { 
     repoStr=Form.form().bindFromRequest().get("repo"); 
..... 

這讓我有第二路線如:

GET  /latest/:repo      controllers.Find.findLatest(repo: String) 
0

正常情況下,所有表單數據都會進入正文,您可以使用bindFromRequest()(請參閱docs)以您的操作方法檢索它們。

如果你真的想要一個表單元素傳遞作爲URL的一部分,那麼你必須動態撰寫您的網址中的JavaScript和改變你的路線。

你的路由看起來是這樣:

GET  /latest/:repo      controllers.Find.findLatest(repo: String) 

和JavaScript部分就像(我沒有實際測試的代碼):

<form name="myform" action="javascript:composeUrl();" method="get"> 
    .... 
    <select name="repo">....</select> 
</form> 

<script> 
    function submitform() { 
    var formElement = document.getElementsByName("myform"); 
    var repo = formElement.options[e.selectedIndex].text; 
    formElement.action = "/lastest/" + repo; 
    formElement.submit(); 
    } 
</script> 
1

你可以改變路線,接受一個空字符串:

GET  /latest/:repo   controllers.Find.findLatest(repo: String = "") 

然後配置你的控制器函數來處理空字符串。

這樣,

<form action="@routes.Find.findLatest()" method="get"> 
.... 
<select name="repo">....</select> 

將評估repo如在控制器級別的空字符串。

1

編輯:支持此實現在播放v的下跌2.1

您可能感興趣的如播放的可選參數play.libs.F.Option [字符串]

實施例:How to handle optional query parameters in Play framework

GET  /latest/:repo/:artifact  controllers.Find.findLatestArtifact(repo: play.libs.F.Option[String], artifact: play.libs.F.Option[String]) 

這將允許你的靈活性,其中參數需要被提供。

不知道你使用的語言,但上面的鏈接中包含Scala和一個例子中的Java方法聲明看起來是這樣的:

import play.libs.F.Option; 
public static Result findLatestArtifact(Option<String> repo, Option<String> artifact){ ... } 

和更新,實現2.1 Routes with optional parameter - Play 2.1 Scala

編輯:播放2。1+支持:道具@RobertUdah下面

初始化爲null:

GET  /latest/    controllers.Find.findLatest(repo: String = null) 
GET  /latest/:repo   controllers.Find.findLatest(repo: String) 

<form action="@routes.Find.findLatest()" method="get"> 
+0

謝謝,唯一的小問題是他們刪除了Play 2.1中Option的Path binder。我們刪除了路徑綁定中的Option [Long]支持,因爲它沒有任何意義可選的路徑參數。如果您願意,您可以實現自己的路徑綁定。 「但傳遞一個可選的而不是一些任意的值在我看來好多了。這不就是我們首先有選擇權的原因嗎?也許我寧願在這種情況下創建2種不同的方法,因爲它比傳遞-1作爲id更有意義。 – lqbweb

+0

@Ruben啊你是對的。這不會工作2.1+。另一種選擇是將你的命名參數變成查詢參數,例如而不是/ latest/repo/artifact你的url看起來與/ latest相似嗎?repo = somerepo&artifact = someartifact哪個是支持2.1+的。對困惑感到抱歉。 – Chrizt0f

+0

@ RobertUdah的答案對你更好,如果你仍然需要空的命名參數。如果你堅持要有repoStr!= null檢查(vs repoStr!= null &&!isE​​mpty()),你可以在路由中將String初始化爲空。例如 GET/latest /:repo controllers.Find.findLatest(repo:String = null) GET/latest /:repo controllers.Find.findLatest(repo:String)。 這將節省您不必在你的視圖中爲空,並允許羅伯特清潔

Chrizt0f

相關問題