我在数据库中填充viewmodel中的列表,然后使用此列表填充视图上的下拉列表。如果我提交表单,则将模型传递给服务器,如果模型无效,则将模型发送回页面。现在,似乎没有一种方式来发送列表或以任何方式保存它,所以我基本上在回发时从数据库中再次检索列表,以便它被发送回视图并且可以重新绑定到下拉列表。
我觉得每次都要查询数据库以查看相同的静态数据似乎很奇怪。我可以缓存查询,但是不是有更好的方法吗?
答案 0 :(得分:1)
有很多方法可以解决这种常见情况。以下是一些方法:
IEnumerable<SelectListItem>
属性/字段,在适当时填充/重新填充。这是最快速和最脏的方法。IEnumerable<SelectListItem>
属性的“序列化”属性,并将其隐藏在表单中。这些属性的getter和setter将序列化和反序列化IEnumerable<SelectListItem>
。如果您完全针对服务器中的AJAX和静态设置,这种技术将起作用: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)
我认为当服务器真正关心所选择的值时,将列表发回服务器是低效的。
如果您担心每次都必须向同一个用户发送相同的列表,您可以让客户端使用本地存储等方式缓存列表。
当然,这意味着每个用户仍然必须第一次获取列表,因此在服务器上您仍然需要构建列表。如果它不经常更改,我会使用您的缓存列表的方法来防止数据库命中。