Задав несколько вопросов о том, как обновить страницу в зависимости от выбранного значения выпадающего элемента управления, теперь у меня возникает новый вопрос. Как-то мой метод «ChangeLanguage» возвращает кешированную версию моего представления.ASP.Net MVC ActionResult возвращает кешированный вид?
Вид:
@model ViewModels.HomeViewModel
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<script src="~/Scripts/jquery-1.10.2.js" type="text/javascript"></script>
<title id="Title">Default</title>
</head>
<body>
<div class="Header">
<div class="HeaderTextArea">
<span id="HeaderText">
@Model.Title.Where(o => o.Language.Equals(Model.SelectedLanguage)).FirstOrDefault().ControlText
</span>
</div>
<div class="HeaderImageArea">
<img id="RB_Image" src="~/Content/Images/RB_Logo.png" alt="RB_IMAGE" />
</div>
<div class="LanguageSelection">
@{
@Html.DropDownList("SelectedLanguage", new SelectList(Model.AvailableLanguages, "ID", "Description"))
}
</div>
</div>
<div class="Content">
@RenderBody()
</div>
<script>
var url = '@Url.Action("ChangeLanguage", "Home")';
$('#SelectedLanguage').change(function() {
$.getJSON(url, {
ID: $(this).val(), Model: @Html.Raw(Json.Encode(Model))
});
});
Обратите внимание, что это мой Layout-View. Я также пробовал это по моему индексу с тем же результатом.
Контроллер:
public class HomeController : Controller
{
public ViewModels.HomeViewModel HVM { get; private set; }
// GET: Home
public ActionResult Index()
{
this.HVM = new ViewModels.HomeViewModel();
this.HVM.SelectedLanguage = this.HVM.AvailableLanguages.First();
return View(this.HVM);
}
public ActionResult ChangeLanguage(int id, ViewModels.HomeViewModel model) {
model.SelectedLanguage = model.AvailableLanguages.Where(o => o.ID.Equals(id)).First();
model.SelectedTitle = model.Title.Where(o => o.Language.Equals(model.SelectedLanguage)).First();
return View("Index", model);
}
}
Метод ChangeLanguage вызывается, изменяет необходимые данные и возвращает «новый» вид, как ожидалось - логика внутри делает вид, что это тоже работа, - но ожидаемое содержание не показать - вместо этого появляются данные из «первого вида». Таким образом, данные и отображаемые данные различаются.
Ps. Я знаю, что представления должны быть немыми, и никакая логика не должна размещаться внутри, но это только для целей тестирования. В конце все должно быть расположено внутри моих ViewModels.
Ваш вызов ajax который остается на той же странице, и вы ajax-вызов не обновляют DOM.И не возвращайте модель обратно к методу (только выбранный идентификатор и инициализируйте новый экземпляр) –
@StephenMuecke Я хочу, чтобы страница полностью перезагрузилась после того, как было выбрано новое значение - не так ли? Я думал, что возвращение нового представления сделает всю новую страницу? Есть ли другой способ вместо использования Ajax? И если я правильно понимаю, лучше практиковать создание нового ViewModel каждый раз, когда язык изменяется? – C4p741nZ
Нет, это не правильный путь. Нет никакого смысла использовать ajax, если вы хотите обновить весь вид (на самом деле ваша реализация просто замедляет работу, чем обычный submit). Но зачем вообще обновляться - лучше просто обновить только часть DOM (вернуть частичное представление и обновить DOM в обратном вызове ajax). В противном случае поместите раскрывающийся список в форму, отправьте его в обычном режиме и передайте выбранный идентификатор методу GET, который инициализирует новый экземпляр на основе идентификатора языка и возвращает представление. –