Обновление:
Каковы элементы управления / поля, значение которых будет отправлено при отправке формы назад?
В форме ASP.NET MVC, если пользователь дважды щелкаетна кнопке отправки форма будет отправлена два раза.Чтобы решить эту проблему, я реализовал решение, объясненное здесь .
Это мое решение, где я отключаю кнопку отправки в форме отправки, чтобы на нее нельзя было нажать снова:
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>
}
}
}
Приведенный выше код должен выполнить следующее действие контроллера (встроенный шаблон идентификации):
[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
Метод действия, и все работает нормально.
Что я не понимаю, так это как провайдер передается в метод действия с самого начала?И почему отключение кнопки не позволяет провайдеру войти в систему?