【发布时间】:2015-12-28 02:42:29
【问题描述】:
我已经多次看到此类问题被问到,但我无法找到正确且干净的方法来做到这一点。 在发布操作中,我的 PossibleAnswers 属性不再设置(正常,因为我没有将其发回)。由于数据来自数据库,我应该如何再次设置它?再次查询数据库对我来说似乎不合逻辑,尽管我猜它有效。是否有替代解决方案,例如缓存列表?
控制器
public ActionResult EditFirstCharac()
{
var userId = _userService.GetUserIdFromName(_userName);
var charac = _characService.GetAllUserCharacteristics(userId).ToList().FirstOrDefault(p => p.SelectedAnswer != null);
var vm = new EditCharacViewModel()
{
CharacId = charac.Id,
IsKey = charac.IsKey,
Question = charac.Question.Title,
Weight = charac.Weight,
PossibleAnswers = charac.Question.PossibleAnswers.ToListSelectListItem(p => p.Id.ToString(), p => p.Label).ToList()
};
return View("Edit", vm);
}
[HttpPost]
public ActionResult EditFirstCharac(EditCharacViewModel vm)
{
if (ModelState.IsValid)
{
// OK, save to DB or whatever
}
// KO, PossibleAnswers is empty
return View("Edit", vm);
}
视图模型
public class EditCharacViewModel
{
public int CharacId { get; set; }
public string Question { get; set; }
[Range(0, 5)]
public int Weight { get; set; }
public bool IsKey { get; set; }
public List<SelectListItem> PossibleAnswers { get; set; }
public string SelectedAnswer { get; set; }
}
查看 @model Dating.WebSite.ViewModels.Profile.EditCharacViewModel
@using (Html.BeginForm("EditFirstCharac", "Profile"))
{
<div>@Model.Question</div>
@Html.EditorFor(p => p.IsKey)
@Html.EditorFor(p => p.Weight)
@Html.DropDownListFor(p => p.SelectedAnswer, Model.PossibleAnswers)
@Html.HiddenFor(p => p.Question, new { id = "Question" })
@Html.HiddenFor(p => p.CharacId, new { id = "CharacId" })
<input type="submit" />
}
【问题讨论】:
-
看来你已经有了答案。返回并再次从 DB 中获取列表是一种方法,尽管效率不高。这可能的答案是固定列表吗?我的意思是,它是否重视变化?如果没有,你可以像你说的那样使用缓存策略。
-
@jpgrassi 是的,这是一个固定列表。缓存听起来不错,但我不知道该怎么做。谢谢。
-
你可以将它存储在应用程序上下文中,或者使用 .Net 4.0 MemoryCach(我已经使用过几次,效果很好)。看看这些链接:asp.net/web-forms/overview/data-access/caching-data/…; stevescodingblog.co.uk/net4-caching-with-mvc
标签: c# asp.net-mvc