我是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;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我必须为所有提交按钮提供按钮名称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");
}
Run Code Online (Sandbox Code Playgroud)
我的观点如何
<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>
Run Code Online (Sandbox Code Playgroud)
public class MultipleSubmitBtnController : Controller
{
[HttpPost]
public ActionResult MultipleSubmitBtn(string b1, string b2, string b3, string b4, string b5)
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用这种语法然后我得到错误
public ActionResult MultipleSubmitBtn(string? b1, string? b2, string b3?, string b4?, string b5?)
Run Code Online (Sandbox Code Playgroud)
请检查您的代码并告诉我它为什么不起作用.谢谢
在HTML5中有一个名为的新属性formaction,您可以在其中更改取决于所单击按钮的action属性form.
<input type='submit' formaction='/home/login' value='Login'>
<input type='submit' formaction='/home/register' value='Register'>
Run Code Online (Sandbox Code Playgroud)
但是,此标记在IE9及更早版本中无效.
编辑:扩展答案
您给出的第二个示例背后的想法是,按钮仅在单击时发送其值.要使action方法起作用,您需要传递a login和register值.但由于只能按下其中一个按钮,因此只传递其中一个值.这就是为什么他添加了两个默认值为0的隐藏字段false,从而确保两个参数始终传递给action方法.单击的按钮将覆盖隐藏的字段.
第一个变量对的名称设置为login.请注意,它被定义了两次,首先是按钮,然后是隐藏字段.如果单击此按钮,true则会发送.如果单击其他按钮,则不会发送此按钮的值,而是发送隐藏字段(具有相同名称).
<button type="submit" name="login" value="true">Login</button>
<input type="hidden" name="login" value="false"/>
Run Code Online (Sandbox Code Playgroud)
第二个变量对(带有名称Register)以相同的方式工作.如果未单击此按钮,隐藏字段将成为"后备选项".
<button type="submit" name="register" value="true">Register</button>
<input type="hidden" name="register" value="false"/>
Run Code Online (Sandbox Code Playgroud)
只能单击其中一个按钮.如果单击了注册按钮,则将使用登录的后备值.如果单击登录按钮,则将使用寄存器的回退值.
总共只有两个变量将被发送到动作脚本:login和register.
如果您想在客户端解决它,您只需让提交按钮使用该onclick事件更改操作即可.
<form name="myFormName" action="Login">
<input type="submit" value="Login" />
<input type="submit" onclick="document.myFormName.action='Register'" value="Register" />
Run Code Online (Sandbox Code Playgroud)
您需要使用for中的name属性form才能工作.
编辑2:点击按钮时更多信息
如果你有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>
Run Code Online (Sandbox Code Playgroud)
...然后你点击b3然后只有b3会将它的值发送回服务器.这样您就可以在服务器上轻松查看单击的按钮.
如果您的服务器上有一个需要所有5个按钮变量的操作方法,那么您必须确保以不同的方式发送它们.原因是MVC尝试使用操作方法匹配传入变量,并且此操作方法需要所有5个按钮变量都有效.
[HttpPost]
public ActionResult LoginRegistration(string b1, string b2, string b3, string b4, string b5)
{
...
}
Run Code Online (Sandbox Code Playgroud)
由于当我们点击b3时b1,b2,b4和b5将不会被发送到服务器,并且由于动作方法需要它们,我们必须找出另一种发送方式.
一种方法是使用与按钮同名的隐藏字段.隐藏字段始终发送到服务器.因此,通过在按钮之后添加这些字段,我们可以确保所有b1,b2,b3,b4和b5都能将某些内容发送到服务器.如果我们点击b3,那么将使用该按钮的值而不是隐藏字段.
<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" />
Run Code Online (Sandbox Code Playgroud)
通过这种方式,上面的操作方法将起作用,因为无论用户点击什么按钮,所有五个b值都将被发送到服务器.
编辑3:没有隐藏字段 可以使用不同的按钮而不具有发送值的后备隐藏字段.我们仍然考虑与以前相同的按钮,使用不同的名称.但这次我们没有隐藏的价值观.因此,如果单击按钮3,则仅将b3 = true发送到服务器.
<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>
Run Code Online (Sandbox Code Playgroud)
对于使用此场景的操作方法,我们需要使所有字段都是可选的,以便MVC可以匹配传入变量的所有/部分/无字段.它是通过写入string?而不是string在参数字段中完成的.这?意味着可选(实际上意味着该值可以为空/ null).
[HttpPost]
public ActionResult LoginRegistration(string? b1, string? b2, string? b3, string? b4, string? b5)
{
...
}
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,即使只b3=true发送了所有其他动作方法,这个动作方法也会起作用.
| 归档时间: |
|
| 查看次数: |
14903 次 |
| 最近记录: |