在MVC中回发之间保留静态列表的更好方法是什么?

时间:2016-10-08 13:16:24

标签: asp.net asp.net-mvc razor

我在数据库中填充viewmodel中的列表,然后使用此列表填充视图上的下拉列表。如果我提交表单,则将模型传递给服务器,如果模型无效,则将模型发送回页面。现在,似乎没有一种方式来发送列表或以任何方式保存它,所以我基本上在回发时从数据库中再次检索列表,以便它被发送回视图并且可以重新绑定到下拉列表。

我觉得每次都要查询数据库以查看相同的静态数据似乎很奇怪。我可以缓存查询,但是不是有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

有很多方法可以解决这种常见情况。以下是一些方法:

  1. 使用javascript而不是使用全页回发 “异步”将表单提交给控制器,并处理 响应。这应该是首选方法。看到很多 示例:https://stackoverflow.com/search?q=mvc+ajax+post
  2. 视图模型中的静态IEnumerable<SelectListItem>属性/字段,在适当时填充/重新填充。这是最快速和最脏的方法。
  3. 在视图模型中创建IEnumerable<SelectListItem>属性的“序列化”属性,并将其隐藏在表单中。这些属性的getter和setter将序列化和反序列化IEnumerable<SelectListItem>。如果您完全针对服务器中的AJAX和静态设置,这种技术将起作用:
  4. E.g(此示例使用Newtonsoft.JSON get it here

    查看模型

    class MyViewModel
    {
    
        public string MyItemFromSelection { get;set;}
    
        public IEnumerable<SelectListItem> MySelectList
        {
            get
            {
                return mySelectList;
            }
            set
            {
                mySelectList = value;
                // serialize to a json string
                SelectListSerialized = Newtonsoft.Json.JsonConvert.SerializeObject(value);
            }
        }
        IEnumerable<SelectListItem> mySelectList;
    
        public string SelectListSerialized
        {
            get
            {
                return selectListSerialized;
            }
            set
            {
                selectListSerialized = value;
                if(MySelectList == null)
                {
                    // if the MySelectList  haven't been set, deserialize the string to populate MySelectList
                    MySelectList = Newtonsoft.Json.JsonConvert.DeserializeObject<IEnumerable<SelectListItem>>(value);
                }
            }
        }
        string selectListSerialized;
    }
    

    <强>剃刀

    @model MyViewModel
    <form>
        @Html.HiddenFor(m => m.SelectListSerialized)
        @Html.DropDownListFor(m => m.MyItemFromSelection, Model.MySelectList)
    </form>
    

答案 1 :(得分:1)

如果要在2个请求之间保留数据,可以简单地使用TempData。

从db获取数据并将它们存储在TempData中。 当您对控制器进行第二次调用时,请使用来自相同tempdata的数据。

这次不需要额外的数据库调用。

另外,如果你想在下一个请求中再次保存和存储这个tempdata值,你可以简单地使用tempdata的“keep”功能。

答案 2 :(得分:0)

我认为当服务器真正关心所选择的值时,将列表发回服务器是低效的。

如果您担心每次都必须向同一个用户发送相同的列表,您可以让客户端使用本地存储等方式缓存列表。

当然,这意味着每个用户仍然必须第一次获取列表,因此在服务器上您仍然需要构建列表。如果它不经常更改,我会使用您的缓存列表的方法来防止数据库命中。