如何以相同的形式处理多个提交按钮

时间:2013-09-05 15:04:48

标签: asp.net-mvc

我是mvc的新手。我知道这种方式我可以处理相同形式的多个提交按钮。

<%
 using (Html.BeginForm("LoginRegistration", new { action = "LoginRegistration", controller = "Register"}, FormMethod.Post, new { @class = "form", id = "formId" }))
    {
     %>
        //your html code here
        <input type="submit" name="submitButton" value="Login"/>
        <input type="submit" name="submitButton" value="Register"/>
<% }%>

[HttpPost]
        public ActionResult LoginRegistration(string submitButton)
        {
            switch (submitButton)
            {
                case "Login":
                    return RedirectToAction("Login");
                case "Register":
                    return RedirectToAction("Register");
                default:
                    return null;
            }
        }

在我的情况下,我必须为所有提交按钮提供按钮名称submitButton但我想给所有提交按钮指定不同的名称。有可能吗?

我想知道有没有其他方法来处理这种情况。所以请用示例代码讨论所有其他方式来处理这种情况。感谢

更新

我看到另一个人以下面的方式处理同样的问题。代码给出但我不明白他的伎俩。他为一个提交按钮添加了一个隐藏字段...为什么? 他将按钮值属性设置为true,并将相应的隐藏字段的value属性设置为false ...为什么我无法理解这个技巧。

另一个问题是何时调用action方法然后将如何传递bool值以及哪个控件的bool值将通过....请仔细阅读此更新的代码并指导我这段代码的详细信息。感谢

<%
 using (Html.BeginForm("LoginRegistration", new { action = "LoginRegistration", controller = "Register"}, FormMethod.Post, new { @class = "form", id = "formId" }))
    {
     %>
        //your html code here
        <button type="submit" name="login" value="true">Login</button>
        <input type="hidden" name="login" value="false"/>
        <button type="submit" name="register" value="true">Register</button>
        <input type="hidden" name="register" value="false"/>
<% }%>

[HttpPost]
        public ActionResult LoginRegistration(bool login, bool register)
        {
           if (login) return RedirectToAction("Login");
           else if (register) return RedirectToAction("Register");
        }

更新

我的观点如何?

<div id="mydiv">
    @using (Html.BeginForm("MultipleSubmitBtn", "MultipleSubmitBtn", FormMethod.Post, new { @Id = "Form1" }))
        {
            <table border="0">

                <tr>
                    <td colspan="2">
                    <button type="submit" id="b1" value="true"> 1 </button>
                    <button type="submit" id="b2" value="true"> 2 </button>
                    <button type="submit" id="b3" value="true"> 3 </button>
                    <button type="submit" id="b4" value="true"> 4 </button>
                    <button type="submit" id="b5" value="true"> 5 </button>

                    <input type="hidden" id="b1" value="false" />
                    <input type="hidden" id="b2" value="false" />
                    <input type="hidden" id="b3" value="false" />
                    <input type="hidden" id="b4" value="false" />
                    <input type="hidden" id="b5" value="false" />
                    </td>
                </tr>
            </table>
        }
</div>

控制器代码

public class MultipleSubmitBtnController : Controller
    {
        [HttpPost]
        public ActionResult MultipleSubmitBtn(string b1, string b2, string b3, string b4, string b5)
        {
            return View();
        }

    }

当我使用这种语法时,我得到了错误

 public ActionResult MultipleSubmitBtn(string? b1, string? b2, string b3?, string b4?, string b5?) 

请检查您的代码并告诉我它为什么不起作用。感谢

3 个答案:

答案 0 :(得分:7)

在HTML5中有一个名为formaction的新属性,您可以根据点击的按钮更改action的{​​{1}}属性。

form

但是,此标记在IE9及更早版本中无效。

修改:扩展回答

您给出的第二个示例背后的想法是,按钮仅在单击时发送其值。要使操作方法起作用,您需要传递<input type='submit' formaction='/home/login' value='Login'> <input type='submit' formaction='/home/register' value='Register'> login值。但由于只能按下其中一个按钮,因此只传递其中一个值。这就是为什么他添加了两个默认值为register的隐藏字段,从而确保两个参数始终传递给action方法。单击的按钮将覆盖隐藏的字段。

第一个变量对的名称设置为false。请注意,它被定义了两次,首先是按钮,然后是隐藏字段。如果单击此按钮,则会发送login。如果单击其他按钮,则不会发送此按钮的值,而是发送隐藏字段(具有相同名称)。

true

第二个变量对(名称为<button type="submit" name="login" value="true">Login</button> <input type="hidden" name="login" value="false"/> )的工作方式相同。如果未单击此按钮,隐藏字段将成为“后备选项”。

Register

只能点击其中一个按钮。如果单击了注册按钮,则将使用登录的后备值。如果单击登录按钮,则将使用寄存器的回退值。

总共只有两个变量将发送到动作脚本:<button type="submit" name="register" value="true">Register</button> <input type="hidden" name="register" value="false"/> login

如果您想在客户端解决问题,只需让提交按钮使用register事件更改操作即可。

onclick

您需要使用<form name="myFormName" action="Login"> <input type="submit" value="Login" /> <input type="submit" onclick="document.myFormName.action='Register'" value="Register" /> 中的name属性才能生效。     

编辑2:点击按钮时更多

如果你有5个按钮......

form

...然后你点击b3然后只有b3会将它的值发送回服务器。这样您就可以在服务器上轻松看到点击的按钮。

如果您的服务器上有一个需要所有5个按钮变量的操作方法,那么您必须确保以不同的方式发送它们。原因是MVC尝试使用操作方法匹配传入变量,此操作方法需要所有5个按钮变量才有效。

<button type="submit" id="b1" value="true"> 1 </button>
<button type="submit" id="b2" value="true"> 2 </button>
<button type="submit" id="b3" value="true"> 3 </button>
<button type="submit" id="b4" value="true"> 4 </button>
<button type="submit" id="b5" value="true"> 5 </button>

由于当我们点击b3时b1,b2,b4和b5不会被发送到服务器,并且由于动作方法需要它们,我们必须找出另一种发送方式。

一种方法是使用与按钮名称相同的隐藏字段。隐藏字段始终发送到服务器。因此,通过在按钮之后添加这些字段,我们可以确保所有b1,b2,b3,b4和b5都能将某些内容发送到服务器。如果我们点击b3,那么将使用该按钮的值而不是隐藏字段。

[HttpPost]
public ActionResult LoginRegistration(string b1, string b2, string b3, string b4, string b5)
{
  ...
}

通过这种方式,上面的操作方法将起作用,因为无论用户点击什么按钮,所有五个b值都将被发送到服务器。

编辑3:没有隐藏字段 可以使用不同的按钮而不具有发送值的后备隐藏字段。我们仍然考虑与以前相同的按钮,使用不同的名称。但这次我们没有隐藏的价值观。因此,如果单击按钮3,则仅将b3 = true发送到服务器。

<input type="hidden" id="b1" value="false" />
<input type="hidden" id="b2" value="false" />
<input type="hidden" id="b3" value="false" />
<input type="hidden" id="b4" value="false" />
<input type="hidden" id="b5" value="false" />

对于使用此场景的action方法,我们需要使所有字段都是可选的,因此MVC可以匹配传入变量的所有/部分/无字段。这是通过在参数字段中编写<button type="submit" id="b1" value="true"> 1 </button> <button type="submit" id="b2" value="true"> 2 </button> <button type="submit" id="b3" value="true"> 3 </button> <button type="submit" id="b4" value="true"> 4 </button> <button type="submit" id="b5" value="true"> 5 </button> 而不是string?来完成的。 string表示可选(实际上意味着该值可以为空/ null)。

?

因此,在这种情况下,即使只发送[HttpPost] public ActionResult LoginRegistration(string? b1, string? b2, string? b3, string? b4, string? b5) { ... } 而其他所有其他都没有发送,此操作方法也会起作用。

答案 1 :(得分:2)

我知道现在回答有点迟,我试试看......:)

我相信更复杂的方法是使用ActionNameAttribute和自定义ActionMethodSelectorAttribute(从ActionMethodSelectorAttribute派生)。它很容易实现。

如果您愿意,可以访问以下链接:http://programersnotebook.blogspot.in/2014/02/aspnet-mvc-actionnameselector-and.htmlhttp://programersnotebook.blogspot.in/2014/02/aspnet-mvc-actionnameselector-and_2.html

答案 2 :(得分:0)

HTML:

undefined

ASP.Net核心控制器:

<input type="submit" value="Save" name="commandSave" />
<input type="submit" value="Approve" name="commandApprove" />