#c# #ajax #asp.net-mvc-5 #modal-dialog
#c# #ajax #asp.net-mvc-5 #модальный диалог
Вопрос:
У меня есть привязка к _Layout для вызова модального с действием, чтобы получить частичное представление для отображения модального
<ul class="navbar-nav mr-auto">
<li class="nav-item">
@Html.Action("LogoutModal", "Account")
<a class="nav-link" href="#" data-toggle="modal" data-target="#modalLogout">
Log Out
</a>
</li>
</ul>
это действие переходит к этому контроллеру
public class AccountController : Controller
{
public ActionResult LoginModal()
{
return PartialView("_PartialLogin");
}
...
и это частичное представление с модальным
@model HutLogistica.ViewModels.LoginViewModel
@{
Layout = null;
}
<link href="~/Content/bootstrap.css" rel="stylesheet" />
<link href="~/Content/login.css" rel="stylesheet" />
<link href="~/Content/fontawesome-all.css" />
<script src="~/scripts/jquery-3.3.1.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/bootstrap.js"></script>
<script src="~/Scripts/fontawesome/all.js"></script>
<!-- Modal -->
<div class="modal fade" id="modalLogin" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { id = "formModal" }))
{
@Html.AntiForgeryToken();
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.EditorFor(model => model.Username, new { htmlAttributes = new { @class = "form-control form-control-lg", placeholder = "Username", autofocus = true } })
@Html.ValidationMessageFor(model => model.Username, "")
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control form-control-lg", placeholder = "Password" } })
@Html.ValidationMessageFor(model => model.Password, "")
@Html.EditorFor(model => model.RememberMe, new { htmlAttributes = new { @class = "custom-control-input", id = "customCheck" } })
<button type="submit" class="btn btn-info">
Entrar
</button>
}
<div id="loader" class="text-center p-3 d-none">
<div class="lds-circle"><div></div></div>
<p><span class="text-muted">Aguarde...</span></p>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ajaxStart(function () {
$("#loader").removeClass('d-none');
});
$(document).ajaxStop(function () {
$("#loader").addClass('d-none');
});
$(function () {
$("#formModal").submit(function () {
if ($(this).valid()) {
$.ajax({
url: this.action,
type: this.method,
cache: false,
processData: false,
contentType: false,
data: $(this).serialize(),
success: function (status, response) {
if (response.success) {
alert('Autenticado com sucesso');
$('#loginModal').modal('hide');
//Refresh
location.reload();
} else {
alert(response.responseText);
}
},
error: function (response) {
alert(response.data.responseText)
}
});
}
return false;
});
</script>
все работает нормально, пока я не отправлю форму в модальном режиме с помощью ajax.
вот контроллер, к которому я перехожу после отправки
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
var user = Authenticate(model);
if (user != null)
{
var ticket = new FormsAuthenticationTicket(
1,
user.Id.ToString(),
DateTime.Now,
DateTime.Now.AddHours(5),
model.RememberMe,
user.Roles.Select(c => c.Nome).FirstOrDefault(),
FormsAuthentication.FormsCookiePath
);
Response.Cookies.Add
(
new HttpCookie
(
FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(ticket)
)
);
return Json(new { success = true });
}
else
{
ModelState.AddModelError("", "Username / Password incorrectos");
return Json(new { success = false, responseText = "Username / Password incorrectos" });
}
}
else
return Json(new { success = false, responseText = "Dados inválidos" });
}
Вот в чем проблема. После отправки формы я перенаправляюсь на localhost:port / Account / Login и показываю содержимое json, если есть ошибка. Я просто хочу получить ошибку при успешном выполнении ajax и распечатать модальную ошибку… Почему меня перенаправляют на контроллер с содержимым json?
Я добавил несколько параметров в конфигурацию ajax в другом сообщении, которое я видел в stackoverflow, но, по-видимому, ничего не изменил в моей ситуации.
Я просто хочу остаться на своем модальном и получить сообщение о состоянии, которое было успешным или произошла ошибка. Если произошла ошибка, я просто обновляю страницу при успешном выполнении ajax, чтобы отобразить зарегистрированный html
Ответ №1:
$("form").submit((e) => {
e.preventDefault();
alert("No redirect");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
First name:<br>
<input type="text" name="firstname"><br>
Last name:<br>
<input type="text" name="lastname">
<button type="submit"> Submit </button>
</form>
Вам необходимо отключить поведение форм по умолчанию
event.preventDefault();
$("#formModal").submit(function () {
event.preventDefault();
// rest of your code here
// ajax request
// or use form.submit()
// form.reset() to reset the form state.
}
Поскольку вы отправляете запрос формы через Ajax, я не думаю, что вам нужно будет использовать form.submit()
, однако вы можете найти form.reset()
полезным.
Вы можете прочитать больше о том, как работает HTMLFormElement здесь .
Приветствия
Комментарии:
1. я уже делал это раньше, и кто-то сказал, что возврата false внизу было достаточно. Тем не менее, он по-прежнему перенаправляет меня с любым из них. Я предполагаю, что что-то вызывает обновление страницы, но я не могу понять, что
2. Обновил ответ ссылкой на JSFiddle. Попробуйте это. Прокомментируйте,
e.preventDefault();
чтобы увидеть до и после.3. хорошо, мне, кажется, удалось выяснить, что вызывает обновление страницы, это ненавязчивая проверка jquery, если ($ (this) . valid()) , однако, если я удалю это, проверка моего клиента будет проигнорирована
Ответ №2:
Изменить
@using (Html.BeginForm(«Логин», «Учетная запись», FormMethod.Post, new { id = «formModal» }))
Для
@using (Html.BeginForm(«LoginModal», «Account», FormMethod.Post, new { id = «formModal» }))
Комментарии:
1. вместо этого он перенаправляет меня на ../Account/LoginModal, это не сработает, я должен отправить модель для входа в систему, а не LoginModal