Представление MVC не обновляется после вызова JQuery
-
21-12-2019 - |
Вопрос
Я создаю веб-приложение MVC 5.В шаблоне макета есть раскрывающийся список, содержащий список имен пользователей.Поскольку этот раскрывающийся список находится в шаблоне макета, он доступен во всех представлениях, которые наследуются от шаблона.
Когда пользователь входит на сайт и проходит аутентификацию, он направляется к методу Index в контроллере.Этот метод принимает идентификатор типа int, допускающий значение NULL.Когда пользователь входит в систему, идентификатор, передаваемый методу Index, всегда равен нулю.Затем я получаю идентификатор вошедшего в систему пользователя и делаю запрос, чтобы получить его данные (см. ниже).
public ActionResult Index(int? id)
{
DashboardViewModel model = new DashboardViewModel();
if(id == null || id == 0)
{
User user = _userService.GetUserByID(Convert.ToInt32(User.Identity.GetUserId()));
model.SelectedUser = user;
}
else
{
model.SelectedUser = _userService.GetUserByID(id.Value);
}
return View(model);
}
Я передаю их данные в ViewModel, а затем в представление, которое затем записывает их адрес электронной почты в пользовательский интерфейс.
@model MyApp.UI.ViewModels.DashboardViewModel
<h1>@Model.SelectedUser.email</h1>
Как только пользователь просмотрит пользовательский интерфейс, он сможет выбрать других пользователей из раскрывающегося списка.При этом адрес электронной почты выбранного пользователя должен заменить его адрес в пользовательском интерфейсе.
Процесс работает следующим образом.Пользователь выбирает имя из раскрывающегося списка, вызывается функция JQuery.
$(document).ready(function () {
$("#UserID").change(GetUser);
function GetUser() {
$.ajax({
type: "GET",
url: '/Dashboard/Index/',
data: { id: $(this).val() },
error: function () {
alert("An error occurred.");
},
success: function () {
alert("success");
}
});
}
});
Эта функция передает идентификатор из раскрывающегося списка обратно в метод Index в контроллере.На этот раз метод Index понимает, что идентификатор НЕ равен NULL, и поэтому выполняет запрос для получения сведений о выбранных пользователях на основе их идентификатора (см. Метод индекса выше).
Детали снова помещаются в ViewModel и передаются в представление.Модель, переданная в представление, содержит сведения о выбранных пользователях, а затем должна записать их адрес электронной почты в пользовательский интерфейс.
@model MyApp.UI.ViewModels.DashboardViewModel
<h1>@Model.SelectedUser.email</h1>
Однако именно здесь моя проблема.Хотя я могу пройтись по своему коду и увидеть, что все работает как положено, независимо от того, какого пользователя я выбираю из раскрывающегося списка, он никогда не меняет адрес электронной почты, записанный в пользовательском интерфейсе.
Это странно, потому что я вижу, что данные выбранных пользователей передаются в ViewModel, однако пользовательский интерфейс никогда не обновляет адрес электронной почты.
Извиняюсь за длинный пост, но я хотел дать как можно больше подробностей, пытаясь исправить это, поскольку я работаю над этим уже больше дня, но безуспешно.
Любая помощь могла бы быть полезна.
Спасибо.
Решение
Насколько я вижу, вы не используете свой $.ajax
результат вызова куда угодно.Вы просто показываете Alert и все готово.Вам нужно использовать данные в результате, но поскольку вы возвращаете целое View
и не просто PartialView
вероятно, лучше просто перенаправить при изменении раскрывающегося списка:
$("#UserID").change(function()
window.location.href = "/Dashboard/Index/" + $(this).val();
);
Вы также можете использовать @Url.Action("Index", "Dashboard")
чтобы избежать жесткого кодирования URL-адреса.