gpt4 book ai didi

asp.net-mvc - ASP.net MVC - 如何在各种 View 上持久化模型

转载 作者:行者123 更新时间:2023-12-01 09:39:44 26 4
gpt4 key购买 nike

情况:在一些用 asp.net 编写的项目管理软件中,我有一个创建项目页面(工作正常)。我需要添加将任务从模板列表添加到此项目预创建的能力,但可用任务列表取决于创建表单中的某些值。

我的抽象解决方案是这样的:

  • 我有一个“创建” View 和一个“添加任务” View - 都强类型到 Controller 中定义的复合 View 模型
  • 我的 Create 方法会检查哪个按钮被用来调用它 - 如果按钮是“添加任务”,然后它呈现 AddTasks View ,从创建 View 传递模型,再次全部在同一个 Controller 中。
  • AddTasks View 使用两个按钮之一发布到 Create View ,一个加载 View ,另一个导致实际的数据库保存。

我的问题是这样的:

  • 不同的 View 使用相同模型的不同属性,但是在它们之间传递这个模型时,数据会被重置(在任何情况下都会重新加载或保存)。
  • 我猜这是由于数据的自动绑定(bind)而发生的 - 尽管我认为表单上不存在的字段不会覆盖传递下来的现有模型数据。
  • 目前 Controller 中几乎没有任何代码可以操作模型 - 在这些情况下,它只会在 View 之间传递。

这是 Controller 代码:

    // 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);
}

问题是:如何在这些 View 中保持模型的状态,直到最终保存它?

我宁愿避免使用任何 hackish (TempData) 或依赖 JS 的解决方案,但如果它们真的是最好的解决方案,我不会拒绝这些。

谢谢,亚当·托利

最佳答案

一个简单的解决方案是将 ViewModel 对象保存在一个 Session 变量中,并从这个源绑定(bind) View 。这当然不是最优雅的解决方案。另一种可能不太优雅的选择是将此模型数据保存在数据库中,并带有一些临时/未保存的标志。

关于asp.net-mvc - ASP.net MVC - 如何在各种 View 上持久化模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1681325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com