2015-03-11 2 views
1

У меня есть представление, которое имеет примерно 10 выпадающих списков, когда я загружаю эту страницу по идентификатору, у которого нет данных, сохраненных против него, выпадающие списки имеют выбранное значение «Пожалуйста, выберите», который создайте как im, создав новую запись.Выпадающее меню MVC запоминает предыдущее выбранное значение из предыдущей записи

Когда я вернусь обратно к этому представлению с идентификатором, у которого есть данные, сохраненные против него, выбранные значения каждого выпадающего списка задаются данными, которые я передаю в представление, которое снова верно.

Но если я затем перезагрузите страницу идентификатором, у которого нет данных, сохраненных против него, выбранные значения выпадающих списков будут установлены из предыдущей записи! Я отлаживал это снова и снова, и для идентификатора, у которого нет данных, связанных с ним, я могу увидеть его передачу в NULL для выбранных значений для каждого раскрывающегося списка. Я предполагаю, что это связано с ModelState? Так что я попытался следующие в начале моего контроллера

ModelState.Clear(); 

Перед методом нагрузки называется, но проблема все еще существует кто-нибудь сталкивался это? Я googled для решения, но единственное, что возникает: «MVC Dropdown не помнит выбранное значение», что является противоположностью проблемы, которая у меня есть.

  • Update *

Я думаю, что я нашел этот вопрос, я в настоящее время использую how to cache objects in MVC поэтому, когда я загрузить выпадающие из БД для страницы, которую я затем хранить их в кэше следующим образом:

if (CacheExtension.IsIncache("ListType")) 
     { 
      model.ListType = CacheExtension.GetFromCache<List<SelectListItem>>("ListType"); 
      model.ListTime = CacheExtension.GetFromCache<List<SelectListItem>>("ListDuration"); 
      model.ListPostageOption = CacheExtension.GetFromCache<List<SelectListItem>>("ListPostage"); 
      model.ListPricingType = CacheExtension.GetFromCache<List<SelectListItem>>("ListPrice"); 
     } 
     else 
     { 

const string queryMultiple = @" 

            SELECT StatusId, StatusDescription from [Status].table1 

            SELECT StatusId, StatusDescription from [Status].table2 

            SELECT StatusId, StatusDescription from [Status].table3 

            SELECT StatusId, StatusDescription from [Status].table4"; 

     using (var sqlCon = new SqlConnection(Con.ReturnDatabaseConnection()).QueryMultiple(queryMultiple)) 
     { 
      var duration = sqlCon.Read().ToList(); 
      var type = sqlCon.Read().ToList(); 
      var options = sqlCon.Read().ToList(); 
      var pricing = sqlCon.Read().ToList(); 

      model.ListType = new List<SelectListItem>(); 
      model.ListTime = new List<SelectListItem>(); 
      model.ListPostageOption= new List<SelectListItem>(); 
      model.ListPricingType = new List<SelectListItem>(); 

      model.ListType .AddRange(
       type.Select(
        item => new SelectListItem { Text = item.StatusDescription, Value = item.StatusId.ToString() })); 

      model.ListTime.AddRange(
       duration.Select(
        item => new SelectListItem { Text = item.StatusDescription, Value = item.StatusId.ToString() })); 

      model.ListPostageOption.AddRange(
       options.Select(
        item => new SelectListItem { Text = item.StatusDescription, Value = item.StatusId.ToString() })); 

      model.ListPricingType.AddRange(
       pricing.Select(
        item => new SelectListItem { Text = item.StatusDescription, Value = item.StatusId.ToString() })); 

      // Cache everything 
      CacheExtension.SaveTocache("ListType", model.ListAdvertType, new DateTime(1)); 
      CacheExtension.SaveTocache("ListDuration", model.ListDuration, new DateTime(1)); 
      CacheExtension.SaveTocache("ListPostage", model.ListPostageOption, new DateTime(1)); 
      CacheExtension.SaveTocache("ListPrice", model.ListPricingType, new DateTime(1)); 
     } 
} 

и я заново загрузить страницу вместо вызова базы данных я проверить кэш, если он существует, я вытаскивать оттуда (это где проблема) Я просто закомментировать тянущее из кэша и он работает, выпадающие меню больше не помнят pre но почему?

+1

Необходимо указать соответствующий код. –

+0

@StephenMuecke Приложение массовое, а также код, мне будет сложно дать вам то, что вам нужно посмотреть, я прошел весь этот день с помощью других разработчиков, но не повезло с проблемой по-прежнему остается! Я думаю, что это проблема кэширования в представлении, причина в том, что мы изменили навигацию приложения, а одна страница по-прежнему показывает старый nav, хотя мы очистили кеш и Ctrl f5. Я думаю, что эти две вещи связаны каким-то образом –

+0

Если вы считаете, что это может быть проблема с кешем, попробуйте добавить '[OutputCache (NoStore = true, Duration = 0, VaryByParam =" * ")]' к методу GET, чтобы предотвратить кеш. В любом случае то, что вы описываете, не является поведением по умолчанию, поэтому в вашем коде есть что-то, вызывающее проблему. Но зачем вам нужно называть 'ModelState.Clear()' - это применимо только в методе POST, если вы хотите сбросить свойство модели перед возвратом представления. –

ответ

0

Я знаю, что это старый вопрос, но поскольку для меня не было конкретного ответа, когда я наткнулся на этот вопрос во время моей собственной аналогичной проблемы, я подумал, что я пойду дальше и отвечу на то, что сработало для меня и объясняет, почему это происходит.

Лучший ответ выше от @StephenMuecke, так как его предложение о хранения коллекций вместо SelectList находится на месте.

Причина в том, что с любой формой кэширования в памяти, кэшированные объекты, возвращаемые указатели на объект в кэше, поэтому любое изменение возвращенного объекта кэша фактически записываются в кэш , В моем случае я хранили List<SelectListItem>. Каждый элемент SelectListItem имеет выбранный атрибут, а на моих страницах cshml, когда я использовал этот List<SelectListItem> в инструкции бритвы DropDownListFor (...), он назначил бы любой элемент, который был выбран обратно в кеш.

Проблема возникла бы при загрузке следующей страницы для другой записи, если это dropdownvalue было нулевым, в кэшированном списке, который я получил, сохранен последний сохраненный выбранный элемент, а поскольку новый элемент был нулевым, он не был перезаписан, таким образом он покажет ранее выбранное значение, когда оно должно быть null, и ничто не должно было быть выбрано.

Чтобы исправить:

  1. Cache List<YourObjectName>, и поиска преобразовать его в List<SelectListItem>.
  2. Другие варианты включают клонирование или десериализацию/сериализацию List<SelectListItems> из кеша.
  3. Конечная опция не использует кеш в памяти, использует вне процесса или механизм распределенного кеша, так как это эффективно сериализует и десериализует объект.

Добрый день, господа.

Смежные вопросы