ASP.NET MVC - 状态和架构

3

在一次配对编程会话之后,出现了一个有趣的问题,我认为我知道答案。

问题:除了写入数据库或文本文件外,ASP.NET MVC 中是否有其他期望的方式来保留“状态”?

在这里,我将“状态”定义为我们有一个人员对象集合,我们创建了一个新对象,转到另一个页面,希望看到新创建的人员(所以没有 Ajax)。

我的想法是,我们不希望有任何熟练的 ViewState 或其他机制,该框架旨在回到无状态的 Web。


嗨,Jfar - 同意这应该作为一个普通问题。 - Dave Mateer
3个回答

1

用户会话怎么样?存储会话中的内容有很多有效用例。还有像memcached这样的分布式缓存系统呢?您似乎也忽略了查询字符串 - 它是一个非常好的状态保存器(?page=2)。对我来说,这些似乎是跨请求保存状态的其他可取方法...?


谢谢。这个https://dev59.com/S0bRa4cB1Zd3GeqPzmHx加强了你所说的。当可能时,似乎我们真的在尝试回到无状态,并且要保持简单 :-) - Dave Mateer

0
我的想法是,我们不希望有任何功夫ViewState或其他机制,这个框架是关于回到无状态的Web。
您提供的示例很容易在没有任何“视图状态功夫”的情况下完成,使用已经在MVC中存在的功能。“用户添加一个人并在下一个屏幕上看到它。”让我编写一个简单的PersonController,它可以完全满足您的要求。
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,那么你试图持久化的状态是什么?


谢谢jfar - 我还在研究你的代码..明天继续 :-) 虽然我真正想表达的已经在我的上面的评论中提到了 - 我们尽可能地朝着无状态架构的方向发展。 - Dave Mateer

0

ASP.NET MVC 提供了一种更清晰的使用模型绑定处理会话存储的方法。您可以编写自定义模型绑定器,以便从会话中提供实例给您的操作方法。请查阅相关文档。


非常感谢 - http://odetocode.com/Blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx 这很不错。 - Dave Mateer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接