У меня есть этот вызов ajax в теге скрипта в нижней части моей страницы. Все работает отлично! Я могу установить точку останова внутри метода действия updatestatus в моем контроллере. Мой сервер также отправляется на рассылку, и этот метод называется большим! Но когда я помещаю javascript внутри js-файла, вызов ajax не попадает на мой сервер. Тем не менее, все остальные операции внутри кода выполняются, а не только после вызова ajax для метода updatestatus для студента.asynchronous HTTP (ajax) запрос работает в теге скрипта, но не в js-файле
<script>
$(document).ready(function() {
console.log("ready!");
alert("entered student profile page");
});
var statusdropdown = document.getElementById("enumstatus");
statusdropdown.addEventListener("change", function (event) {
var id = "@Model.StudentId";
var url = '@Url.Action("UpdateStatus", "Student")';
var status = $(this).val();
$.post(url, { ID: id, Status: status }, function (data) {
// do something with the returned value e.g. display a message?
// for example - if(data) { // OK } else { // Oops }
});
var e = document.getElementById("enumstatus");
if (e.selectedIndex == 0) {
document.getElementById("statusbubble").style.backgroundColor = "#3fb34f";
} else {
document.getElementById("statusbubble").style.backgroundColor = "#b23f42";
}
}, false);
</script>
Теперь я положил это внизу моей страницы.
@section Scripts {
@Scripts.Render("~/bundles/studentprofile")
}
и в моем файле bundle.config это выглядит следующим образом
bundles.Add(new ScriptBundle("~/bundles/studentprofile").Include(
"~/Scripts/submitstatus.js"));
и submitstatus.js выглядит следующим образом. Я знаю, что он вводит и запускает этот код, потому что я вижу предупреждение и цвет фона. Таким образом, код работает. Его просто не отправляют обратно на мой сервер.
$(document).ready(function() {
console.log("ready!");
alert("submit status entered");
var statusdropdown = document.getElementById('enumstatus');
statusdropdown.addEventListener("change", function (event) {
var id = "@Model.StudentId";
var url = '@Url.Action("UpdateStatus", "Student")';
var status = $(this).val();
$.post(url, { ID: id, Status: status }, function (data) {
// do something with the returned value e.g. display a message?
// for example - if(data) { // OK } else { // Oops }
});
var e = document.getElementById('enumstatus');
if (e.selectedIndex == 0) {
document.getElementById("statusbubble").style.backgroundColor = "#3fb34f";
} else {
document.getElementById("statusbubble").style.backgroundColor = "#b23f42";
}
}, false);
});
В окне консоли я получаю сообщение об ошибке.
POST https://localhost:44301/Student/@Url.Action(%22UpdateStatus%22,%20%22Student%22) 404 (Не найдено)
Код Razor не анализируется во внешних файлах, поэтому такие вещи, как «var url =» @ Url.Action («UpdateStatus», «Student») '; 'wont work. Вам нужно определить эти переменные в главном представлении или сохранить результаты в атрибутах 'data- *' элементов, чтобы их можно было прочитать во внешнем файле –
, единственное место, где я использую идентификатор, находится в скрытом поле, m, чтобы я мог снова получить значение в сообщении. Я вижу, что вы не можете получить доступ к скрытому полю. Какие-либо предложения? Могу ли я передать данные viewmodel в функцию изменения функции прослушивания javascript? – user1186050
Это не имеет ничего общего со скрытыми полями (хотя, поскольку вы используете jquery, почему бы не использовать 'var statusdropdown = $ ('# enumstatus');'). Если сценарий находится в отдельном файле, значения 'id' и' url' не будут установлены правильно (как вы можете видеть его текстовое значение, а не вычисленное значение), поскольку они включают код бритвы (который не анализируется, когда страница загружена) –