MVC下拉菜单会记住此前的纪录先前选择的值(MVC dropdown remembers previ

2019-10-22 05:45发布

我有有大约10下拉菜单,当我加载这个页面对其中有没有保存的反对数据ID的视图的下拉菜单中有“请选择”所选的值,它是创建作为即时通讯创造了新的记录。

当我导航回到该视图与具有保存的针对它的数据的ID,每个选择的值下拉通过我通过在以这又是正确的视图数据集。

但是,如果我再重新加载该页面使用没有保存的反对数据的ID,在下拉菜单中选择值从此前的纪录设定! 我已经调试这一遍又一遍并没有数据链接它,我可以看到它在传递NULL为每个下拉菜单选择值的ID。 我假设这是与ModelState中呢? 所以,我想在我控制器开始以下

ModelState.Clear();

之前load方法被调用,但问题仍然存在,有没有人遇到过吗? 我GOOGLE了一个解决方案,但所出现的唯一的东西,“MVC下拉不记得选择的值”,这是相反我有问题。

  • *更新

我想我已经找到了问题,我目前使用如何缓存在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));
        }
}

和我重新加载,而不是调用我检查缓存数据库页面,如果存在的话,我从那里拉(这是哪里出了问题),我刚才注释掉从缓存的拉动,它已经不记得工作的下拉菜单以前的值,但为什么呢?

Answer 1:

我知道这是一个老问题,但没有具体的答案在这里对我来说,当我在我自己类似的问题时无意中发现了这个问题,我想我会继续前进,把答案在为我工作的,并解释为什么它的发生。

上面的最好的答案是从@StephenMuecke,因为他的有关存储的集合,而不是一个的SelectList是当场就建议。

究其原因是因为与任何形式的内存缓存,还给缓存的对象指向高速缓存中的对象,所以返回的缓存对象所做的任何变更实际写入到缓存 。 以我为例,我存储List<SelectListItem> 每个SelectListItem有选择的属性,并在我的cshml网页时,我使用了List<SelectListItem>在DropDownListFor(...)剃刀声明,它将指定任何项被选定回缓存。

会出现对不同记录的下一个页面加载的问题,如果dropdownvalue是空的,我检索到的缓存列表保留最后保存选中的项目,因为新的项目为null,它没有被覆盖,所以会表现出之前选择的时候应该已经无效,并没有什么应该被选择的值。

修理:

  1. 缓存List<YourObjectName>并在检索它转换成一个List<SelectListItem>
  2. 其他选项包括克隆或反串行化/串行化List<SelectListItems>从缓存。
  3. 最后一个选项是不使用内存高速缓存,使用了进程或分布式缓存机制,因为这将有效地序列化和反序列化对象。

好日子先生们。



文章来源: MVC dropdown remembers previous selected value from previous record