70

A Razor view has 3 buttons inside a form. All button's actions will need form values which are basically values coming input fields.

Every time I click any of buttons it redirected me to default action. Can you please guide how I can submit form to different actions based on button press ?

I really appreciate your time, guidance and help.

4

14 回答 14

100

你也可以试试这个:

<input type="submit" name="submitbutton1" value="submit1" />
<input type="submit" name="submitbutton2" value="submit2" />

然后在你的默认函数中调用你想要的函数:

if( Request.Form["submitbutton1"] != null)
{
    // Code for function 1
}
else if(Request.Form["submitButton2"] != null )
{
    // code for function 2
}
于 2013-10-29T08:12:59.667 回答
91

这个优雅的解决方案适用于提交按钮的数量:

@Html.Begin()
{
  // Html code here
  <input type="submit" name="command" value="submit1" />
  <input type="submit" name="command" value="submit2" />

}

并在您的控制器的操作方法中接受它作为参数。

public ActionResult Create(Employee model, string command)
{
    if(command.Equals("submit1"))
    {
      // Call action here...
    }
    else
    {
      // Call another action here...
    }
}
于 2015-04-17T10:49:50.823 回答
17

在视图中

<form action="/Controller_name/action" method="Post>

 <input type="submit" name="btn1" value="Ok" />
 <input type="submit" name="btn1" value="cancel" />
 <input type="submit" name="btn1" value="Save" />
</form>

在行动中

string str =Request.Params["btn1"];
if(str=="ok"){


}
if(str=="cancel"){


}
if(str=="save"){


}
于 2013-10-29T08:27:29.537 回答
10

You can use JS + Ajax. For example, if you have any button you can say it what it must do on click event. Here the code:

 <input id="btnFilterData" type="button" value="myBtn">

Here your button in html: in the script section, you need to use this code (This section should be at the end of the document):

<script type="text/javascript">
$('#btnFilterData').click(function () {
    myFunc();
});
</script>

And finally, you need to add ajax function (In another script section, which should be placed at the begining of the document):

function myFunc() {
    $.ajax({
        type: "GET",
        contentType: "application/json",
        url: "/myController/myFuncOnController",
        data: {
             //params, which you can pass to yu func
        },
        success: function(result) {

        error: function (errorData) {

        }
    });
};
于 2013-10-29T06:16:08.223 回答
4

我找到的最干净的解决方案如下:

这个例子是执行两个非常不同的动作;基本前提是使用值将数据传递给动作。

在您看来:

@using (Html.BeginForm("DliAction", "Dli", FormMethod.Post, new { id = "mainForm" }))
{
    if (isOnDli)
    {
        <button name="removeDli" value="@result.WeNo">Remove From DLI</button>
    }
    else
    {
        <button name="performDli" value="@result.WeNo">Perform DLI</button>
    }
}

然后在你的行动中:

    public ActionResult DliAction(string removeDli, string performDli)
    {
        if (string.IsNullOrEmpty(performDli))
        {
            ...
        }
        else if (string.IsNullOrEmpty(removeDli))
        {
            ...
        }

        return View();
    }

这段代码应该很容易改变以实现主题的变化,例如将按钮的名称更改为相同的,然后您只需要一个操作参数等,如下所示:

在您看来:

@using (Html.BeginForm("DliAction", "Dli", FormMethod.Post, new { id = "mainForm" }))
{

        <button name="weNo" value="@result.WeNo">Process This WeNo</button>

        <button name="weNo" value="@result.WeNo">Process A Different WeNo This Item</button>
}

然后在你的行动中:

    public ActionResult DliAction(string weNo)
    {
        // Process the weNo...

        return View();
    }
于 2015-04-17T10:35:33.073 回答
4

这对我有用。

formaction="@Url.Action("Edit")"

片段:

 <input type="submit" formaction="@Url.Action("Edit")" formmethod="post" value="Save" class="btn btn-primary" />

<input type="submit" formaction="@Url.Action("PartialEdit")" formmethod="post" value="Select Type" class="btn btn-primary" />

 [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit( Quote quote)
        {
           //code 
       }
 [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult PartialEdit(Quote quote)
        {
           //code
        }

可能会帮助一些想要拥有 2 种不同操作方法而不是使用选择器或使用客户端脚本的一种方法的人。

于 2017-10-16T08:21:09.513 回答
3

尝试在视图中以自己的形式包装每个按钮。

  @using (Html.BeginForm("Action1", "Controller"))
  {
    <input type="submit" value="Button 1" />
  }

  @using (Html.BeginForm("Action2", "Controller"))
  {
    <input type="submit" value="Button 2" />
  }
于 2013-10-29T15:24:25.077 回答
3

您可以使用普通按钮(非提交)。使用 javascript 将表单的“action”属性(在“onclick”事件中)重写为您想要的内容,然后提交。使用自定义助手生成按钮(在项目根目录的 App_Code 文件夹内创建文件“Helper.cshtml”)。

@helper SubmitButton(string text, string controller,string action)
{   
    var uh = new System.Web.Mvc.UrlHelper(Context.Request.RequestContext);
    string url = @uh.Action(action, controller, null);   
    <input type=button  onclick="(
                                       function(e)
                                                 {
                                                   $(e).parent().attr('action', '@url'); //rewrite action url
                                                   //create a submit button to be clicked and removed, so that onsubmit is triggered
                                                   var form = document.getElementById($(e).parent().attr('id'));
                                                   var button = form.ownerDocument.createElement('input');
                                                   button.style.display = 'none';
                                                   button.type = 'submit';
                                                   form.appendChild(button).click(); 
                                                   form.removeChild(button);              
                                                  }
                                      )(this)" value="@text"/>
}

然后将其用作:

@Helpers.SubmitButton("Text for 1st button","ControllerForButton1","ActionForButton1")
@Helpers.SubmitButton("Text for 2nd button","ControllerForButton2","ActionForButton2")
...

在你的表格里面。

于 2015-06-22T17:22:07.860 回答
3

最简单的方法是使用 html5FormActionFormMethod

<input type="submit" 
           formaction="Save"
           formmethod="post" 
           value="Save" />
    <input type="submit"
           formaction="SaveForLatter"
           formmethod="post" 
           value="Save For Latter" />
    <input type="submit"
           formaction="SaveAndPublish"
           formmethod="post"
           value="Save And Publish" />

[HttpPost]
public ActionResult Save(CustomerViewModel model) {...}

[HttpPost]
public ActionResult SaveForLatter(CustomerViewModel model){...}

[HttpPost]
public ActionResult SaveAndPublish(CustomerViewModel model){...}

我们可以使用许多其他方式,请参阅这篇文章ASP.Net MVC multiple submit button use in different ways

于 2017-10-13T15:49:08.437 回答
2

除了@Pablo 的回答,对于较新的版本,您还可以使用 asp-page-handler 标签助手。

在页面中:

<button asp-page-handler="Action1" type="submit">Action 1</button>
<button asp-page-handler="Action2" type="submit">Action 2</button>

然后在控制器中:

    public async Task OnPostAction1Async() {...}
    public async Task OnPostAction2Async() {...}
于 2020-02-26T17:13:11.150 回答
1

信息来自: http: //www.codedigest.com/posts/46/multiple-submit-button-in-a-single-form-in-aspnet-mvc

对于最近来的小伙子,您可以使用 HTML 5 Formaction 属性。

在您的<input><button>

只需定义:

<button id="btnPatientSubmit" type="submit" class="btn btn-labeled btn-success" formaction="Edit" formmethod="post">

注意添加了formation="Edit",这指定了我想在我的控制器中提交哪个ActionResult。

这将允许您拥有多个提交按钮,每个按钮都可以提交到控制器中的独立 ActionResult(方法)。

于 2021-09-21T19:57:27.880 回答
0

这个答案将向您展示如何使用 razor 在 asp.net 中工作,以及如何控制多个提交按钮事件。例如,我们有两个按钮,一个按钮将我们重定向到“PageA.cshtml”,另一个按钮将我们重定向到“PageB.cshtml”。

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

于 2014-02-14T16:28:15.393 回答
0

没有看到使用标签助手(Core MVC)的答案,所以这里(删除操作):

在 HTML 上:

<form action="" method="post" role="form">
<table>
@for (var i = 0; i < Model.List.Count(); i++)
{
    <tr>
        <td>@Model.List[i].ItemDescription</td>
        <td>
            <input type="submit" value="REMOVE" class="btn btn-xs btn-danger" 
             asp-controller="ControllerName" asp-action="delete" asp-route-idForDeleteItem="@Model.List[i].idForDeleteItem" />
        </td>
    </tr>
}
</table>
</form>

在控制器上:

[HttpPost("[action]/{idForDeleteItem}"), ActionName("Delete")]
public async Task<IActionResult> DeleteConfirmed(long idForDeleteItem)
{
    ///delete with param id goes here
}

不要忘记[Route("[controller]")]在类声明之前使用 - 在控制器上。

于 2017-09-27T12:42:42.803 回答
0

如果您使用的是纯剃须刀,即没有 MVC 控制器:

<button name="SubmitForm" value="Hello">Hello</button>
<button name="SubmitForm" value="World">World</button>
@if (IsPost)
{
    <p>@Request.Form["SubmitForm"]</p>
}

单击每个按钮应呈现 Hello 和 World。

于 2017-06-12T13:33:39.310 回答