2013-05-10 41 views
36

我有一個ASP.Net和剃鬚刀的形式。ASP.Net MVC 4 2個表單提交按鈕/動作

我需要兩種方式提交表單:一個通過Edit操作,另一個通過Validate操作。

我應該怎麼做呢?

我不介意爲此使用JavaScript。

編輯:

使用自定義屬性我得到這個錯誤。

行動 'Resultados' 上控制器類型 'InspecoesController' 當前請求是採用以下的操作方法之間曖昧: System.Web.Mvc.ActionResult Validar(了System.Collections.Generic.ICollection 1[Waveform.IEP.Intus.Server.Web.ViewModels.ResultadoViewModel]) on type Waveform.IEP.Intus.Server.Web.Controllers.InspecoesController System.Web.Mvc.ActionResult Resultados(System.Collections.Generic.ICollection 1 [波形。在類型IEP.Intus.Server.Web.ViewModels.ResultadoViewModel])Waveform.IEP.Intus.Server.Web.Controllers.InspecoesController

+0

對於MVC 6請參見http哪個按鈕被點擊的操作方法://計算器。 com/questions/36555265/asp-net-mvc-core-6-multiple-submit-buttons – Softlion 2016-12-21 17:29:16

回答

73

這就是我們在我們的應用程序:
屬性

public class HttpParamActionAttribute : ActionNameSelectorAttribute 
{ 
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase)) 
      return true; 

     var request = controllerContext.RequestContext.HttpContext.Request; 
     return request[methodInfo.Name] != null; 
    } 
} 

操作飾有它:


[HttpParamAction] 
public ActionResult Save(MyModel model) 
{ 
    // ... 
} 

[HttpParamAction] 
public ActionResult Publish(MyModel model) 
{ 
    // ... 
} 

HTML /剃刀

@using (@Html.BeginForm()) 
{ 
    <!-- form content here --> 
    <input type="submit" name="Save" value="Save" /> 
    <input type="submit" name="Publish" value="Publish" /> 
} 

name提交按鈕應符合動作/方法名

這樣的屬性,你就不必硬編碼的URL在JavaScript

+0

和-1對...? – Ramunas 2013-05-10 10:37:19

+0

我喜歡你的方法。但是,我似乎無法讓它工作。我有控制器中的動作名稱設置按鈕的'name'屬性。我在我的問題上得到了例外。 (順便說一句,我沒有downvote你) – 2013-05-10 11:38:30

+0

你可以請確認'HttpParamActionAttribute.IsValidName()'是所有打?如果是,請求[methodInfo.Name]'的值是多少? – Ramunas 2013-05-10 11:45:53

43

您可以用jQuery做到這一點,只是把兩種方法提交到不同勢例如使用以下格式的網址:

<form id="myForm"> 
    <%-- form data inputs here ---%> 
    <button id="edit">Edit</button> 
    <button id="validate">Validate</button> 
</form> 

你可以使用這個腳本(確保它位於視圖,以使用Url.Action屬性):

<script type="text/javascript"> 
     $("#edit").click(function() { 
      var form = $("form#myForm"); 
      form.attr("action", "@Url.Action("Edit","MyController")"); 
      form.submit(); 
     }); 

     $("#validate").click(function() { 
      var form = $("form#myForm"); 
      form.attr("action", "@Url.Action("Validate","MyController")"); 
      form.submit(); 
     }); 
</script> 
+0

我不知道'form.attr()'。這應該做的伎倆。謝謝。 – 2013-05-10 10:19:55

+0

使用javascript/jquery,你可以操縱任何dom屬性,尤其是使用'attr()'的元素屬性。如果你不確定是否有方法需要使用jQuery文檔(http://docs.jquery.com/) - 有很多知識.. – 2013-05-10 10:21:26

+1

你應該使用'#edit'語法而不是'button #edit',假設你沒有跨不同元素類型的重複ID(大概是我看到正在使用的唯一原因)。通過ID查詢要快得多。如果你在RHS上使用非ID選擇器,你會更好一些,因爲它正在削減列表。但是由於普通ID選擇器使用'DOM.getElementById('')'(至少不必首先查找所有'button'元素),它會更快。 – JoeBrockhaus 2014-10-23 15:41:59

5

這裏一個好的解釋: ASP.NET MVC – Multiple buttons in the same form

2個字:
你可以分析提交的按鈕在你的行動價值

作出與您的版本ActionMethodSelectorAttribute(我個人更喜歡和建議)的單獨行動。

+0

我的回答是通過文章的版本:) – Ramunas 2013-05-10 10:38:34

+1

@Ramunas正好,+1 – Dima 2013-05-10 10:39:19

+0

完美!不錯的快速和簡單的實現使用,而不是混亂的代碼在視圖與JQuery/Javascript BTW,自定義ActionMethodSelectorAttribute方法你把這個類在哪裏?它是否需要在框架中註冊一些? – eaglei22 2015-12-09 14:57:43

8

如果你正在使用剃鬚刀在asp.net中工作,並且你想控制多個提交按鈕事件,那麼這個答案會引導你。例如,我們有兩個按鈕,其中一個按鈕會將我們重定向到「PageA.cshtml」,而其他按鈕會將我們重定向到「PageB.cshtml」。

@{ 
    if (IsPost) 
    { 
     if(Request["btn"].Equals("button_A")) 
     { 
      Response.Redirect("PageA.cshtml"); 
     } 
     if(Request["btn"].Equals("button_B")) 
     { 
      Response.Redirect("PageB.cshtml"); 
     } 
    } 
} 
<form method="post"> 
    <input type="submit" value="button_A" name="btn"/>; 
    <input type="submit" value="button_B" name="btn"/>;   
</form> 

3

<input type="submit" value="Create" name="button"/> 
 
<input type="submit" value="Reset" name="button" />

寫入的Controler下面的代碼。

[HttpPost] 
     public ActionResult Login(string button) 
     { 
      switch (button) 
      { 
       case "Create": 
        return RedirectToAction("Deshboard", "Home"); 
        break; 
       case "Reset": 
        return RedirectToAction("Login", "Home"); 
        break; 
      } 

      return View(); 
     } 
3

有了HTML5,您可以使用button[formaction]

<form action="Edit"> 
    <button type="submit">Submit</button> <!-- Will post to default action "Edit" --> 
    <button type="submit" formaction="Validate">Validate</button> <!-- Will override default action and post to "Validate --> 
</form> 
1

我們可以通過兩種方式都這樣了,

要麼有同樣的觀點在2個表單提交,並具有2種Action方法在控制器但您將需要提交所需的字段,並將表格提交至

ex在此給出代碼Multiple forms in view asp.net mvc with multiple submit buttons

或者

有2個或多個提交按鈕說btnSubmit1和btnSubmit2並檢查使用的代碼

if (Request.Form["btnSubmit1"] != null) 
{ 
// 
} 
if (Request.Form["btnSubmit2"] != null) 
{ 
// 
}