2009-01-02 61 views
9

我有一個應用程序,我需要用戶能夠從數據庫更新或刪除數據行。這些行在我的視圖的.aspx文件中使用foreach循環顯示給用戶。每行將有兩個文本字段(txtName,txtDesc),一個更新按鈕和一個刪除按鈕。我不確定的是,我如何讓更新按鈕將消息發送給控制器以更新哪一行?我可以看到這樣做的幾種方法:將ASP.NET MVC視圖上的各個按鈕映射到控制器操作

  1. 把每一行放在它自己的表單標籤中,然後當點擊更新按鈕時,它只會提交該行的值(也會有一個隱藏字段與rowId)和控制器類將把所有後期值作爲參數傳遞給控制器​​上的Update方法。
  2. 不知何故,讓按鈕被編寫腳本,以只發送該行的值到POST的控制器。

有沒有辦法做到這一點?我關心的一件事是,如果每行對於由ASP.NET分配的控件(txtName1,txtDesc1,txtName2,txtDesc2)具有不同的名稱,那麼它們的值將如何映射到Controller方法的正確參數?

+0

如果您使用按鈕標籤而不是輸入,則可以分別設置值和顯示文本,然後檢查控制器中的值。 – 2012-10-03 06:23:35

回答

11

您可以使用多個表單,並設置表單上的動作是這樣的:

<form method="post" action="/YourController/YourAction/<%=rowId%>"> 

所以,你將有YourController/YourAction/1YourController/YourAction/2等。

有沒有必要給不同的文本框不同的名稱,只需將它們稱爲txtName,txtDesc等(或者更好,擺脫那些txt前綴)。由於它們有不同的形式,它們不會混淆。

然後在行動,你這樣做

public ActionResult YourAction(int id, string username, string description) 

凡的用戶名,說明是你的表單控件(因此會自動映射)使用相同的名稱。 id參數將自動映射到您在表單操作中添加的數字。

+0

這個答案是正確的。我會補充一點,雖然元素名稱可以並且應該是每個表單重複的,但每個元素都應該有唯一的ID。 – 2009-01-03 15:18:07

0

由於rodbv表示要使用單獨的<form>元素。

當你使用Asp.Net MVC或傳統的HTML(PHP,經典的ASP等)時,你必須忘記Asp.Net處理按鈕的方式。當一個表單被髮回到web服務器時,所有服務器知道的僅僅是「表單已發送,並且包含以下輸入元素」。

Asp.net(標準)在使用javascript(__doPostback javascript函數幾乎在任何地方使用)中添加了許多標準html回發操作的封裝,並且添加了有關表單的哪個輸入元素導致回發並將其傳遞的信息以隱藏的形式變量到服務器。你可以模仿這種行爲,如果你真的這麼想,但我會建議反對它。

看起來有點奇怪,亂七八糟的頁面上有很多<form>,但是這意味着回發到服務器的重量會更輕,應該讓所有的事情都能以更快的速度運行。

4

您也可以像在窗體上多個「有效的名爲」按鈕:

<input type="submit" value="Save" name="btnSave" id="btnSave"/> 
<input type="submit" value="Delete" name="btnDelete" id="btnDelete"/

,比檢查,看看你收到什麼提交。只能有一個提交每形式發送的動作,所以它是像所有其他的提交按鈕並沒有在第一時間確實存在:

if (HttpContext.Request.Form["btnDelete"] != null) { 
    //Delete stuff 
} elseif (HttpContext.Request.Form["btnSave"] != null) { 
    //Update stuff 
} 

我也認爲你可以實現像這裏http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx定製ActionMethodSelectorAttribute(也列在上面)具有更清晰的分離代碼。

相關問題