【发布时间】:2010-12-13 11:19:25
【问题描述】:
情况:在一些用 asp.net 编写的项目管理软件中,我有一个创建项目页面(工作正常)。我需要添加将任务从模板列表添加到此项目预创建的能力,但可用任务列表取决于创建表单中的某些值。
我的抽象解决方案是这样的:
- 我有一个“创建”视图和一个“添加任务”视图 - 两者都强类型化到控制器中定义的复合 viewModel
- 我的 Create 方法检查使用哪个按钮来调用它 - 如果 按钮是“添加任务”,然后它呈现 AddTasks 视图,从创建视图传递模型,再次在同一个控制器中。
- AddTasks 视图使用两个按钮之一发布到 Create 视图,一个加载视图,另一个导致实际的数据库保存。
我的问题是这样的:
- 不同的视图使用相同模型的不同属性,但是在它们之间传递这个模型时,数据被重置(在任何情况下都重新加载或保存)。
- 我猜这是由于数据的自动绑定而发生的 - 尽管我认为表单上不存在的字段不会覆盖传递下来的现有模型数据。
- 目前控制器中几乎没有任何代码来操作模型 - 在这些情况下,它只在视图之间传递。
这是控制器代码:
// 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 依赖的解决方案,但如果它们真的是最好的解决方案,我不会拒绝这些。
谢谢, 亚当·托利
【问题讨论】:
标签: asp.net-mvc model-view-controller mvccontrib