我有一个带有表单的asp.net mvc应用程序。
提交表单时,它会使用linq-to-sql将记录添加到sql数据库中。添加记录后,控制器再次显示该表单,并应在表单上显示这些新值。但是,当它显示表单时,值为空,直到您刷新页面。
在跟踪代码时,我可以看到记录在提交时被添加到数据库中,但视图不会显示它们,除非我刷新。视图不是问题,它只显示视图模型,它在帖子后立即缺少新记录。
我知道这有点模糊,但不知道这里要包含哪些代码部分。
这是否与数据上下文生命周期有关?基本上,在发布表单时会创建一个数据上下文,然后在显示表单的方法中创建不同的数据上下文。
有关可能导致此问题的任何建议吗?
更新:
我可以在这里发布很多代码,但我会尝试给你一个简化的版本:
此代码维护志愿者作业的时间表
视图使用带有计划列表的视图模型,并显示计划表格及其关联的分配。 (儿童记录)
在发布表单时,使用新的时间表& assignemnts,创建计划记录,并创建相关的分配记录。
// Controller
public class SchedulerController : Controller
{
ScheduleServices ScheduleSvc = new ScheduleServices(); // creates a new data context
public ActionResult Index()
{
return ShowSchedules();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection form)
{
ScheduleSvc.ProcessRequest(form);
return Index();
}
}
public ActionResult ShowSchedules()
{
SchedulerViewModel sched_vm = new SchedulerViewModel();
sched_vm.EventsAndSchedules = ScheduleSvc.GetEventSchedulesFromDate();
return View(sched_vm);
}
ProceessScheduleRequest(ScheduleRequest req)
{
CreateSchedule(req);
AssignmentServices AssignmentSvc = new AssignmentServices(); // creates it's own data context
AssignmentSvc.Assign(req);
}
答案 0 :(得分:1)
我在this post(神话#10)中找到了答案。
显然,对于多个工作单元使用相同的DataContext,会导致过时数据,因为DataContext实例跟踪的对象不会仅通过重新查询来刷新。
我没有使用相同的DataCcontext来添加记录,然后显示结果,而是使用了两个单独的并修复了它。因此,我没有为整个控制器类创建一个ScheduleServices实例,而是为ProcessRequest()创建一个,为ShowSchedules()创建一个。
答案 1 :(得分:0)
保存到数据库后,您应该重定向到显示数据的控制器方法。这将导致控制器方法再次从数据库中查找数据,现在将显示新更新的记录。