У меня есть представление, которое имеет примерно 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 но почему?
Необходимо указать соответствующий код. –
@StephenMuecke Приложение массовое, а также код, мне будет сложно дать вам то, что вам нужно посмотреть, я прошел весь этот день с помощью других разработчиков, но не повезло с проблемой по-прежнему остается! Я думаю, что это проблема кэширования в представлении, причина в том, что мы изменили навигацию приложения, а одна страница по-прежнему показывает старый nav, хотя мы очистили кеш и Ctrl f5. Я думаю, что эти две вещи связаны каким-то образом –
Если вы считаете, что это может быть проблема с кешем, попробуйте добавить '[OutputCache (NoStore = true, Duration = 0, VaryByParam =" * ")]' к методу GET, чтобы предотвратить кеш. В любом случае то, что вы описываете, не является поведением по умолчанию, поэтому в вашем коде есть что-то, вызывающее проблему. Но зачем вам нужно называть 'ModelState.Clear()' - это применимо только в методе POST, если вы хотите сбросить свойство модели перед возвратом представления. –