在一次配对编程会话之后,出现了一个有趣的问题,我认为我知道答案。
问题:除了写入数据库或文本文件外,ASP.NET MVC 中是否有其他期望的方式来保留“状态”?
在这里,我将“状态”定义为我们有一个人员对象集合,我们创建了一个新对象,转到另一个页面,希望看到新创建的人员(所以没有 Ajax)。
我的想法是,我们不希望有任何熟练的 ViewState 或其他机制,该框架旨在回到无状态的 Web。
在一次配对编程会话之后,出现了一个有趣的问题,我认为我知道答案。
问题:除了写入数据库或文本文件外,ASP.NET MVC 中是否有其他期望的方式来保留“状态”?
在这里,我将“状态”定义为我们有一个人员对象集合,我们创建了一个新对象,转到另一个页面,希望看到新创建的人员(所以没有 Ajax)。
我的想法是,我们不希望有任何熟练的 ViewState 或其他机制,该框架旨在回到无状态的 Web。
用户会话怎么样?存储会话中的内容有很多有效用例。还有像memcached这样的分布式缓存系统呢?您似乎也忽略了查询字符串 - 它是一个非常好的状态保存器(?page=2)。对我来说,这些似乎是跨请求保存状态的其他可取方法...?
public ActionResult Add()
{
return View(new Person());
}
[HttpPost]
public ActionResult Add(PersonViewModel myNewPersonViewModel)
{
//validate, user entered everything correctly
if(!ModelState.IsValid)
return View();
//map model to my database/entity/domain object
var myNewPerson = new Person()
{
FirstName = myNewPersonViewModel.FirstName,
LastName = myNewPersonViewModel.LastName
}
// 1. maintains person state, sends the user to the next view in the chain
// using same action
if(MyDataLayer.Save(myNewPerson))
{
var persons = MyDataLayer.GetPersons();
persons.Add(myNewPersion);
return View("PersonGrid", persons);
}
//2. pass along the unique id of person to a different action or controller
//yes, another database call, but probably not a big deal
if(MyDataLayer.Save(myNewPerson))
return RedirecToAction("PersonGrid", ...etc pass the int as route value);
return View("PersonSaveError", myNewPersonViewModel);
}
现在,我感觉到你想要在PersonSaveSuccess
页面之后再添加一个人或者其他什么。如果是这样的话,你可能想要使用TempData[""]
,它是一个单次会话,只保存从一个请求到另一个请求的状态,或者以某种方式管理传统的Session[""]
。
让我感到困惑的是,你可能已经在数据库中获取了所有的人员信息。如果你保存了一个人员信息,在下一次调用GetPersons()
时,它应该在你的人员集合中。如果你没有使用Ajax,那么你试图持久化的状态是什么?
ASP.NET MVC 提供了一种更清晰的使用模型绑定处理会话存储的方法。您可以编写自定义模型绑定器,以便从会话中提供实例给您的操作方法。请查阅相关文档。