2009-08-26 31 views
3

通常,在ASP.NET MVC中,是否可以在同一個表單中放置兩個不同的按鈕來發布不同的控制器動作?在同一個ASP.NET MVC表單中使用2個按鈕

我基本上試圖在同一個表單中有兩個輸入(type =「button」)標記,但我希望它們執行不同的控制器操作。我想在少數情況下這樣做,因爲我認爲它能夠點擊按鈕而不是超鏈接提供良好的審美。有沒有辦法做到這一點,或者我應該以不同的方式進行設計?

回答

1

關於在瀏覽器中處理這方面的一些想法:

  • 您可以使用風格看起來像按鈕的鏈接。這很容易做到,無論是圖像還是通過將鏈接放入具有邊框的塊元素中。
  • 您可以使用兩個不直接提交的按鈕;他們改爲在提交之前調用一個設置表單動作的javascript函數。
+0

鏈接不提交表單。如果他們(通過JS) - 那麼第一和第二種方法的區別在哪裏? – 2009-08-26 16:59:57

+0

鏈接可以執行獲取請求,並且您可以使用JavaScript構建URL。但是,你是對的 - 如果你需要提交表單元素,鏈接沒有真正的好處。 – 2009-08-26 18:46:25

+0

樣式鏈接和按鈕看起來一樣,最終是我去的方向。感謝您的建議! – YeahStu 2009-10-06 13:33:51

9

如果不使用Javascript,則無法實現。使用Javascript,您只需定義不同的點擊處理程序即可調用適當的操作。

$(function() { 
     $('#button1').click(function() { 
      $(form).attr('action', '<% Url.Action("action1") %>') 
       .submit(); 
      return false; // prevent default submission 
     }); 
     $('#button2').click(function() { 
      $(form).attr('action', '<% Url.Action("action2") %>') 
       .submit(); 
      return false; // prevent default submission 
     }); 
}); 
+0

請注意,這個例子是使用jQuery ...一個很好的選擇IMO。 – 2009-08-27 02:15:55

0

這與ASP.NET MVC無關,但與HTML。我看到你如何做到這一點的唯一方法是通過檢查按下哪個按鈕來修改表單標籤的action屬性,通過使用javascript來提交表單。

0

那麼有幾種方法可以處理這個問題。假設你沒有使用按鈕單擊發送數據,我會使用選項3.如果必須包含數據,請考慮選項1和某種臨時數據存儲(如TempData)。

  1. 一種形式職位上提交一個控制器 動作和控制器 動作檢查哪個按鈕被點擊 ,然後調度 RedirectToAction()。 (不很大)
  2. 在一個頁面上張貼到多個控制器動作(更好)
  3. 內部或形式之外創建一個input type="button",並給它一個onclick處理 用戶重定向到一個控制器動作多種形式(最佳)
+0

重定向不會保留傳遞的數據。您必須將數據存儲在TempData中才能保留它。 – tvanfosson 2009-08-26 15:23:36

+0

好點tvan。 – 2009-08-26 15:27:13

0

沒有試過,但考慮到點擊的按鈕ID並獲得通過HTTP POST發送,你也許可以這樣做:

<input type="submit" name="GO" ID="GO" value="GO BUTTON" /> 
<input type="submit" name="STOP" ID="STOP" value="STOP BUTTON" /> 

然後在MVC結束,只是有兩個方法,其中一個帶有go參數,另一個帶有stop參數。

0

方法#1

如何使用兩種不同形式包裝的按鈕,然後使用CSS來定位他們中的一個,以使其顯示(視覺)是「主」的形式內?

一個非常簡單的例子:

 
<fieldset id="CombinedForm"> 

<form ... action="Method1"> 
    ...form stuff here... 
    <input id="Button1" type="submit" value="Do something"> 
</form> 

<form ... action="Method2"> 
    ...form stuff here... 
    <input id="Button2" type="submit" value="Do something else"> 
</form> 

</fieldset> 

...然後使用CSS如下:

 
#CombinedForm { 
    position: relative; 
    padding-bottom: 2em; /* leave space for buttons */ 
} 

#Button1, #Button2 { 
    position: absolute; 
    bottom: 0; 
} 

#Button1 { 
    left: 0; 
} 

#Button2 { 
    right: 0; 
} 

的結果應該是,你有一個fieldsetdiv它看起來像一個形式,有裏面有兩個實際的HTML表單,以及兩個位於父框中的按鈕,但仍然提交到不同的位置。

方法#2

另一種方法發生:具有在相同的形式兩個按鈕,指向一個控制器動作,即然後決定(基於按鈕的值點擊)重定向到哪個動作。

+0

#1 - 很可能這些按鈕需要提交相同的數據,所以它不起作用。 #2感覺尷尬 - 不是嗎? :) – 2009-08-26 17:02:33

+0

@Amis - 這一切都感覺有點尷尬:p但是,如果他們提交相同的數據,唯一的區別是如何處理它,那麼對我來說,這聽起來像是用不同的開關同樣的方法。 TBH,這很可能會用於確定/取消按鈕,其中取消不需要提交任何數據。 – 2009-08-26 21:35:43

0

它不是必要的JavaScript ...

這個怎麼樣

公衆的ActionResult DoSomething的()
{
          //一些業務邏輯
          TempData [「PostedF ormValues「] = Request.Form;
         如果(的Request.Form( 「按鈕a」)!= NULL)
          {
               返回RedirectToAction( 「ActionA」,RouteData.Values) ;
         }
         返回RedirectToAction( 「ActionB」,RouteData.Values);
}

1

如果你想要的是像OK &取消按鈕,然後看看this post by David Findley

我在編輯視圖中使用此方法,其中有一個編輯按鈕和一個刪除按鈕。刪除按鈕只需要該項目的ID。在下面的代碼中,你可以看到我已經命名了我的屬性「AcceptFormValueAttribute」。這對我來說很好,因爲我的Delete [Get]操作只是顯示一條消息,要求確認,所以需要重定向。

[ActionName("Edit")] 
    [AcceptFormValue(Name = "Action", Value = "Delete")] 
    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult EditDelete(int? id) 
    { 
     return RedirectToAction("Delete", new { id = id }); 
    } 
0

我認爲我可以提出更簡單的建議。

例如,您有兩個按鈕:ButtonA,ButtonB並且想要對每個按鈕執行不同的 操作。 簡單的辦法是:只要使用BeginForm聲明:

@using (Html.BeginForm("ButtonA" , "Home")) 
{ 
     <input type="submit" value="ButtonA"/> 
} 

@using (Html.BeginForm("ButtonB" , "Home")) 
{ 
     <input type="submit" value="ButtonB" /> 
} 

您還必須聲明按鈕a,ButtonB行動,您的主頁控制器:

[HttpPost] 
public ActionResult ButtonA() 
{ . . . } 

[HttpPost] 
public ActionResult ButtonB() 
{ . . . } 
相關問題