2015-03-31 6 views
0

Задав несколько вопросов о том, как обновить страницу в зависимости от выбранного значения выпадающего элемента управления, теперь у меня возникает новый вопрос. Как-то мой метод «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.

+0

Ваш вызов ajax который остается на той же странице, и вы ajax-вызов не обновляют DOM.И не возвращайте модель обратно к методу (только выбранный идентификатор и инициализируйте новый экземпляр) –

+0

@StephenMuecke Я хочу, чтобы страница полностью перезагрузилась после того, как было выбрано новое значение - не так ли? Я думал, что возвращение нового представления сделает всю новую страницу? Есть ли другой способ вместо использования Ajax? И если я правильно понимаю, лучше практиковать создание нового ViewModel каждый раз, когда язык изменяется? – C4p741nZ

+1

Нет, это не правильный путь. Нет никакого смысла использовать ajax, если вы хотите обновить весь вид (на самом деле ваша реализация просто замедляет работу, чем обычный submit). Но зачем вообще обновляться - лучше просто обновить только часть DOM (вернуть частичное представление и обновить DOM в обратном вызове ajax). В противном случае поместите раскрывающийся список в форму, отправьте его в обычном режиме и передайте выбранный идентификатор методу GET, который инициализирует новый экземпляр на основе идентификатора языка и возвращает представление. –

ответ

1

Ваш не кэширование ничего. Вызов ajax остается на той же странице. Вы вызываете метод, который возвращает представление (это должно быть частичное представление), но тогда вы ничего не делаете с этим контентом (т. Е. Обновляете DOM). В вашем скрипте также используется $.getJSON(), который ожидает json, но ваш метод контроллера возвращает html, поэтому он не будет работать. Кроме того, не возвращайте всю модель, используя @Html.Raw(Json.Encode(Model). Это приведет к тому, что исходная модель (неизмененная), к которой у вас уже есть доступ в контроллере, будет просто ухудшающей производительность.

3 опции, которые вы могли бы рассмотреть

  1. Пропустите выбранный язык в контроллер метод, который возвращает JSON , как я указал в своем ответе на один из ваших previous questions. Это даст лучшую производительность
  2. Pass выбранный язык к методу контроллера, который возвращает частичное представление и обновить DOM

Controller (обратите внимание, удалить public ViewModels.HomeViewModel HVM { get; private set; })

public PartialViewResult ChangeLanguage(int id) { 
    HomeViewModel model = new HomeViewModel(); 
    model.SelectedLanguage = model.AvailableLanguages.Where(o => o.ID.Equals(id)).First(); 
    model.SelectedTitle = model.Title.Where(o => o.Language.Equals(model.SelectedLanguage)).First(); 
    return PartialView(model); // the partial just contains the elements you want to update 
} 

Посмотреть

<div id="mycontent"></div> 

$('#SelectedLanguage').change(function() { 
    $('#mycontent').load(url, { ID: $(this).val() }); 
}); 
  1. Если yo ur не связан с производительностью, поместите раскрывающийся список в форму с кнопкой отправки и выполните обычную отправку (нет реальной точки в использовании ajax, если вы хотите сгенерировать полный новый вид)
0

добавить OutputCache атрибут, как показано ниже

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] 
public ActionResult ChangeLanguage(int id, ViewModels.HomeViewModel model) { 
Смежные вопросы