2009-05-22 84 views
1

我有一個MVC應用程序,它有一組字段用於爲個人(電子郵件,電話,傳真,AIM)添加聯繫人詳細信息。 ..等)。最初,我爲相應的數據提供了一個輸入類型和輸入字段的下拉列表,以及一個添加一組字段的鏈接。ASP.Net MVC - 添加字段到添加鏈接的創建表單(不包含javascript)

完成後,我有一個提交按鈕來提交表單。

我很高興通過添加鏈接和JavaScript來添加更多字段的方法,但我無法解決如何在沒有javascript的情況下執行此操作。

我會感謝在最好的方向解決這個問題的一些指針。我對保持添加鏈接並不特別珍貴,它可能是一個按鈕,但我寧願在地址欄中不更改網址。

謝謝,理查德

回答

0

這基本上是答案的客戶端。如果您必須在不使用JavaScript的情況下執行此操作,並且不更改URL,則基本上會留下POST。

<form action="" method="post"> 
<input name="field1"/> 
<input name="field2"/> 
... 
<input name="add_field_submit" type="submit" value="Add Field"/> 
... 
<input name="done_submit" type="submit" value="Submit"/> 

在服務器上,你發現他們是否點擊添加字段(add_field_submit存在),或者提交(done_submit存在)。如果他們單擊添加字段,則添加一個字段並提供視圖。否則,就完成了。

+1

謝謝馬修,我現在不能嘗試這些,但我我們一定要在週末嘗試並報告。我不確定的是如何區分兩個服務器端,但發現這個答案:http://stackoverflow.com/questions/442704/how-do-you-handle-multiple-submit-buttons-in- ASP淨MVC的框架/ 443047#443047。我會在下面Tomas的答案中嘗試一下。 – Richbits 2009-05-22 17:03:12

0

隨着jQuery這是很容易插入HTML元素到DOM,對飛,不回發。它使用JavaScript,你在標題中說你不想要,但是你確實說過在問題中沒問題,所以告訴我你是否需要別的東西。
所以你真正需要弄清楚的是處理數據時,發送到服務器的方式...

...並且也不必太難。如果我沒有弄錯(但我可能是),那麼input中與name相同的元素值將作爲值數組處理。因此,如果您使用通用名稱插入新元素,則應該可以通過迭代服務器上的陣列來檢索所有數據。

這個網站

<input type="text" name="customData" /> 
<input type="text" name="customData" /> 

會後,您可以使用服務器上的此C#代碼獲取數據:

public ActionResult DoCoolStuff(FormCollection postedValues) { 
    foreach(string data in postedValues.customData) { 
     // This is where the cool stuff goes 
    } 
    Return RedirectToAction("Index"); 
} 
+0

托馬斯,感謝您的回答,抱歉,我現在可以看到問題如何不清楚,並已編輯。我很高興,這意味着我知道如何用javascript來做到這一點。不過,我希望完全包容,因此爲沒有JavaScript的瀏覽器提供解決方案。 – Richbits 2009-05-22 13:51:21

+0

啊!我會看看我是否可以提出一些...做到這一點的一種方法(儘管它可能不是最佳的),當然是下面的Matthews解決方案,並且將會在每次回發時增加的會話變量中保存字段數量。在MVC中,你可以有一個鏈接發回另一個ActionMethod,它添加一個字段並再次提供視圖。其實,我覺得我對如何做到這一點有一個相當整潔的想法 - 如果我找到一些額外的時間,我會用另一個答案寫下來=) – 2009-05-22 14:43:20

1

正如Matthew所說,如果您不想更改URL並且不想使用JavaScript,那麼您最好的選擇是向服務器發送POST請求。然而,在ASP.Net MVC中,這可以非常整潔地完成。您需要修改View兩個附加項,並添加新的ActionMethod

來看,第1部分
添加一個額外的表單視圖(這是不允許的WebForms,所以它可能會感到有點陌生,但它是完全正常的MVC)。

<form action="/myController/myView/<%= (ViewData["fieldCount"]+ 1) %>"> 
    <input type="submit" value="Add custom field" /> 
</form> 

fieldCount變量 - 這應該從Controller如下面給出向下傳遞:

的控制器
添加以下ActionMethod超載您目前有顯示錶單中的一個:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult myView(int id) { 
    ViewData["fieldCount"] = id; 
    Return View(); 
} 

我使用了變量名稱id,這樣你就不必另一條路線。

來看,第2部分
現在,當你有一個已知的段計數,所以你可以循環出的視場:

<form action="/myController/SaveData/" method="post"> 
    ... 
    <% for(i=0; i<int.TryParse(ViewData["fieldCount"]); i++) { %> 
     <input type="text" name="customData" /><br /> 
    <% } %> 
    ... 
</form> 

注意這兩種形式有不同的動作 - 這樣,您不必擔心點擊一個提交按鈕會意外發布錯誤的數據。