情况:在一些用 asp.net 编写的项目管理软件中,我有一个创建项目页面(工作正常)。我需要添加将任务从模板列表添加到此项目预创建的能力,但可用任务列表取决于创建表单中的某些值。
我的抽象解决方案是这样的:
- 我有一个“创建”视图和一个“添加任务”视图 - 都强类型到控制器中定义的复合视图模型
- 我的 Create 方法检查使用哪个按钮来调用它 - 如果按钮是“添加任务”,它会呈现 AddTasks 视图,从创建视图传递模型,再次全部在同一个控制器中。
- AddTasks 视图使用两个按钮之一发布到创建视图,一个加载视图,另一个导致实际的数据库保存。
我的问题是这样的:
- 不同的视图使用相同模型的不同属性,但是在它们之间传递这个模型时,数据被重置(在任何情况下都重新加载或保存)。
- 我猜这是由于数据的自动绑定而发生的——尽管我认为表单上不存在的字段不会覆盖传递下来的现有模型数据。
- 目前在控制器中几乎没有任何代码来操作模型——在这些情况下,它只在视图之间传递。
这是控制器代码:
// POST: /Project/Create/<viewModel>
[Authorize, AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "Id,id")] ProjectViewModel model)
{
if (model.SubmitValue == "Create")
{
try
{
model.Project.Id = Guid.NewGuid();
model.Save(this.User.Identity.Name);
return this.RedirectToAction("Details", new {id = model.Project.Id});
}
catch (Exception e)
{
this.ModelState.AddModelError(e.ToString(), e.ToString());
}
return View(model);
}
if(model.SubmitValue == "AddTasks")
{
return this.View("AddTasks",model);
}
return this.View(model);
}
//POST: /Project/AddTasks/ + model
[Authorize, AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddTasks([Bind(Include = SelectedCarrierTasks")]ProjectViewModel model)
{
return View(model);
}
问题是:如何在这些视图中维护模型的状态,直到最终保存它?
我宁愿避免使用任何 hackish(TempData)或 JS 依赖的解决方案,但如果它们真的是最好的解决方案,我不会拒绝这些。
谢谢,亚当托利