回发表单时将提交其值的控件/字段是什么?
在ASP.NET MVC表单中,如果用户双击“提交”按钮,则该表单将被提交两次。为了解决此问题,我实施了here中说明的解决方案。
这是我的解决方案,其中我禁用了表单提交上的“提交”按钮,因此无法再次单击它:
function preventFromBeingDoubleSubmitted() {
$('form').each(function () {
$(this).submit(function (e) {
if ($("form").valid()) {
// if form is valid, then disable the submit button so it cannot be double clicked (double submitted)
$(this).find(':submit').attr('disabled', 'disabled');
}
});
});
}
$(document).ready(function () {
preventFromBeingDoubleSubmitted();
});
这工作正常,但是使用内置的身份验证代码ASP.NET时,我得到一个非常奇怪的行为。我的登录页面,允许用户使用Facebook或Google登录(每个按钮均为“提交”按钮):
这是生成上述登录表单的代码(这是内置的身份模板):
@{
var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes();
if (loginProviders.Count() > 0)
{
using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = Model.ReturnUrl }))
{
@Html.AntiForgeryToken()
<div class="form-group">
@foreach (AuthenticationDescription p in loginProviders.OrderBy(o => o.Caption))
{
if (string.Equals(p.AuthenticationType, "google", StringComparison.InvariantCultureIgnoreCase))
{
<button type="submit" class="external-login-btn btn-google" id="@p.AuthenticationType" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">Log in with @p.AuthenticationType</button>
}
if (string.Equals(p.AuthenticationType, "facebook", StringComparison.InvariantCultureIgnoreCase))
{
<button type="submit" class="external-login-btn btn-facebook" id="@p.AuthenticationType" name="provider" value="@p.AuthenticationType" title="Log in using your @p.Caption account">Log in with @p.AuthenticationType</button>
}
}
</div>
}
}
}
上面的代码,应点击以下Controller Action(内置身份模板):
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
}
添加.js代码以防止重复提交后,外部登录将不再起作用。问题是,当用户单击使用Facebook登录按钮时,提供程序名称将不再传递到ExternalLogin
操作中。
如果我删除了preventFromBeingDoubleSubmitted()
函数,则提供者名称将通过ExternalLogin
Action方法传递,并且一切正常。
我不明白的是,提供程序最初是如何传递给操作方法的?为什么禁用按钮会阻止提供程序被传入?
答案 0 :(得分:2)
我将首先回答这个问题:
我不明白的是,提供程序最初是如何传递给操作方法的?
您有一个带有name="provider" value="@p.AuthenticationType"
的按钮,此代码会将提供程序名称传递给您的操作方法。
下一步:
为什么禁用按钮会阻止提供程序被传入?
提交表单时,禁用字段的值不会传递到服务器。这是默认行为。
现在要解决它,我们可以隐藏按钮而不是禁用它。因此,您可以在preventFromBeingDoubleSubmitted()
中将$(this).find(':submit').attr('disabled', 'disabled');
更改为$(this).find(':submit').hide();
希望这会有所帮助。
更新
回答有关表单数据中包含哪些字段的新问题。
<input>
<button>
<option>
答案 1 :(得分:1)
HTML表单是文档的一部分,其中包含常规内容,标记,称为控件的特殊元素(复选框,单选按钮,菜单等)以及这些控件上的标签。在将表单提交给代理进行处理(例如,提交给Web服务器,邮件服务器等)之前,用户通常可以通过修改表单的控件(输入文本,选择菜单项等)来“完成”表单。 >
用户通过命名控件与表单进行交互。
控件的“控件名称”由其name属性给出。 FORM元素中控件的name属性的范围是FORM元素。
HTML定义了以下控件类型:
因为按钮是控件,所以按钮的值将被发布到服务器(如果按钮具有示例中的名称和值)。因此,这是关于html规范。不是asp.net mvc,不是Microsoft的规范
您可以参考这些链接以获取更多详细信息