У меня есть индексная страница с таблицей и простая форма с двумя раскрывающимися списками. На странице также есть несколько разделов с частичными просмотрами. При отправке мне нужно обновить только эти div, а не всю страницу.
Кто-то помог мне с ajax и контроллером. Форма отправки работает отлично. Он отправляет форму и делает почти все, что должен. Но при отправке вместо того, чтобы вернуться к ajax для обновления div, он перенаправляет меня на URL-адрес контроллера со строкой, в которой говорится все, что я передаю в разделе возврата. Как-то сбивает с толку. Я надеюсь, что приведенные ниже разделы помогут разобраться в этом.
Частичный вид формы:
<form id = "ajax_submit" asp-controller = "Home" asp-action = "CreateBreak" class = "DthdropdownGroup ml-3">
<div class = "btn-group" style = "margin-left:-1rem">
<select class = "form-group dropdownStyling btn-sm dropdown-toggle d-inline-block btn-outline-light" style = "width: 7.4em;" type = "button" data-toggle = "dropdown" aria-haspopup = "true" aria-expanded = "false" id = "EmployeeId" asp-for = "EmployeeId">
<option>Dispatcher</option>
@foreach (var item in Model.Employees)
{
<option class = "dropdown-item pr-1 form-control" value = "@item.Id">@item.DisplayName</option>
}
</select>
</div>
<div class = "btn-group">
<select class = "form-group dropdownStyling btn-sm dropdown-toggle d-inline-block btn-outline-light" style = "width: 7.3em" type = "button" data-toggle = "dropdown" aria-haspopup = "true" aria-expanded = "false" id = "EmpPosition" asp-for = "EmpPosition">
<option>Position</option>
@foreach (var item in Model.Positions)
{
<option class = "dropdown-item pr-1" value = "@item.Id">@item.PositionName</option>
}
</select>
</div>
<button type = "submit" class = "btn btn-sm btn-block dropdownStyling" id = "break-submit" style = "margin-left: -1rem; width:15rem;">Submit</button>
Контроллер:
[HttpPost]
public async Task<JsonResult> CreateBreak(int EmployeeId, int EmpPosition)
{
Break newBreak = new Break();
newBreak.EmployeeId = EmployeeId;
newBreak.EmpPosition = EmpPosition;
newBreak.TimeEntered = DateTime.Now;
_context.Add(newBreak);
await _context.SaveChangesAsync();
return Json(new { success = true, });
}
Javascript:
$(document).on("submit", "#ajax_submit", function () {
// prevent regular form submit
e.preventDefault();
var data = {
EmployeeId: $("#EmployeeId").val(),
EmpPosition: $("#EmpPosition").val()
}
$.ajax({
type: "Post",
url: "/Home/CreateBreak",
dataType: 'json',
data: data,
success: function () {
$(" #headerRefresh ").load(window.location.href + " #headerRefresh ");
$(" .breakRefresh ").load(window.location.href + " .breakRefresh ");
},
});
})
Часть кода из одного из партиалов, чтобы увидеть, как я настроил партиалы:
<div class = "dthRefresh">
<table class = "table table-bordered">
<tbody>
@foreach (var item in Model.Dths)
{
@*////EMPLOYEE SENT////*@
@if (item.EmpSent == true)
{
<tr style = "background-color:lightgreen; font-size:large">
<td class = "w-75 h-25 p-0">
<input type = "hidden" class = "hiddenDthID" value = "@item.Id" />
<a href = "Javascript:;" class = "empNameDth" style = "color:black">@[email protected]</a>
<td class = "h-25 p-0" style = "font-size:large">@item.EmpPositionNavigation.PositionName</td>
<td class = "h-25 justify-content-center p-0 pl-1">
<input type = "checkbox" value = "" id = "flexCheckChecked" checked>
</td>
</tr>
}
Форма отправляется просто отлично, но когда я отправляю, она возвращает это:
Таким образом, вместо того, чтобы обновлять эти элементы div и оставаться на странице индекса, он меняет URL-адрес на Home/CreateBreak. Он должен оставаться в индексе и просто обновлять те элементы div, которые находятся на индексной странице. Я застрял на несколько дней. Я очень ценю чью-либо помощь.
But on submit, instead of going back to ajax to refresh the divs, it redirects me to the controller's URL with a line that says whatever I pass in the return section. Kind of confusing.
Это потому, что вы не можете предотвратить отправку обычной формы.
Вы пропустили e
в function ()
, измените, как показано ниже:
$(document).on("submit", "#ajax_submit", function (e) {
// prevent regular form submit
e.preventDefault();
//...
})
Привет, не могли бы вы нажать F12 и проверить панель консоли в браузере, что за сообщение об ошибке?
Похоже, я получаю 500 - "jquery.min.js:2 POST локальный: 44392/Главная/CreateBreak 500 send @ jquery.min.js:2 ajax @ jquery.min.js:2 (анонимно) @ site.js?v=ot2lAjlOLC… DVO0ZU7cP1DSfuM:120 диспетчеризация @ jquery.min.js:2 v.handle @ jquery.min.js:2"
Не могли бы вы проверить значение $("#EmployeeId").val()
и $("#EmpPosition").val()
? Вы можете проверить значение, добавив код, например: console.info($("#EmployeeId").val())
перед var data=xxxxx
. Затем проверьте значение на панели консоли в браузере.
Кроме того, не могли бы вы проверить панель Output
в инструменте Visual Studio, если есть какое-либо сообщение об ошибке?
Спасибо за вашу помощь. Я не вижу присвоенного значения. В нем говорится «Диспетчер site.js?v=mRow04-BNUmcSwjM8YX655Xjn1u-veLGpTrbuSHmF6o:114», но нет значения. Строка ниже имеет то же самое для позиции. Что касается ошибки, то она имеет только ту, что выше - сообщение 500.
Давайте продолжить обсуждение в чате.
Ты прав. хороший улов. Спасибо. Когда я вставляю это, он вообще ничего не делает - не подчиняется.