提交按钮是否将其值传递给表单提交中的操作方法?

时间:2019-04-04 05:21:51

标签: c# jquery asp.net-mvc asp.net-mvc-4 asp.net-identity-2

更新:

回发表单时将提交其值的控件/字段是什么?


在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登录(每个按钮均为“提交”按钮):

enter image description here

这是生成上述登录表单的代码(这是内置的身份模板):

@{
    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方法传递,并且一切正常。

我不明白的是,提供程序最初是如何传递给操作方法的?为什么禁用按钮会阻止提供程序被传入?

2 个答案:

答案 0 :(得分:2)

我将首先回答这个问题:

  

我不明白的是,提供程序最初是如何传递给操作方法的?

您有一个带有name="provider" value="@p.AuthenticationType"的按钮,此代码会将提供程序名称传递给您的操作方法。

下一步:

  

为什么禁用按钮会阻止提供程序被传入?

提交表单时,禁用字段的值不会传递到服务器。这是默认行为。

现在要解决它,我们可以隐藏按钮而不是禁用它。因此,您可以在preventFromBeingDoubleSubmitted()中将$(this).find(':submit').attr('disabled', 'disabled');更改为$(this).find(':submit').hide();

希望这会有所帮助。

更新

回答有关表单数据中包含哪些字段的新问题。

  1. <input>
  2. <button>
  3. <option>

答案 1 :(得分:1)

HTML表单是文档的一部分,其中包含常规内容,标记,称为控件的特殊元素(复选框,单选按钮,菜单等)以及这些控件上的标签。在将表单提交给代理进行处理(例如,提交给Web服务器,邮件服务器等)之前,用户通常可以通过修改表单的控件(输入文本,选择菜单项等)来“完成”表单。 >

用户通过命名控件与表单进行交互。

控件的“控件名称”由其name属性给出。 FORM元素中控件的name属性的范围是FORM元素。

HTML定义了以下控件类型:

  • 按钮
  • 复选框
  • 单选按钮
  • 菜单:菜单为用户提供了可供选择的选项。 SELECT元素结合OPTGROUP和OPTION元素创建菜单。
  • 输入控件(数字,文本等)
  • 隐藏控件
  • 对象控件:作者可以以某种形式插入通用对象,以便与其他控件一起提交关联的值。作者使用OBJECT元素创建对象控件。

因为按钮是控件,所以按钮的值将被发布到服务器(如果按钮具有示例中的名称和值)。因此,这是关于html规范。不是asp.net mvc,不是Microsoft的规范

您可以参考这些链接以获取更多详细信息