【问题标题】:ASP.NET MVC - State and ArchitectureASP.NET MVC - 状态和体系结构
【发布时间】:2012-10-30 00:59:17
【问题描述】:

在结对编程会议之后,出现了一个有趣的问题,我想我知道答案了。

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

我将在这里定义状态,表示我们有一组人员对象,我们创建一个新对象,然后转到另一个页面,并期望看到新创建的人员。 (所以没有 Ajax)

我的想法是我们不想要任何功夫 ViewState 或其他机制,这个框架是要回到无状态网络。

【问题讨论】:

  • 嗨,Jfar - 同意这作为一个普通问题会更好。

标签: asp.net-mvc


【解决方案1】:

用户会话呢?有很多有效的用例可以在会话中存储东西。那么像 memcached 这样的分布式缓存系统呢?您似乎也忽略了查询字符串 - 这是一个出色的状态保护程序 (?page=2)。对我来说,这些似乎是跨请求保存状态的其他理想方法...?

【讨论】:

【解决方案2】:

我的想法是我们不想要任何功夫的 ViewState 或其他机制,这个框架是关于回到无状态网络的。

您提供的示例很容易使用 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[""],它是一个单一的服务会话,并且只将 state 从一个请求保存到另一个请求,或者以某种方式自己管理传统的 Session[""]

让我感到困惑的是,无论如何,你可能要去 db 找你所有的人。如果您保存了一个人,它应该在您下次调用GetPersons() 时出现在您的个人收藏中。如果您不使用 Ajax,那么您要保持什么状态?

【讨论】:

  • 谢谢 jfar - 我还在玩你的代码.. 明天再回来 :-) 虽然我真正要了解的是上面的 cmets - 我们真的在走向无状态架构可能。
【解决方案3】:

ASP.NET MVC 提供了一种使用模型绑定处理会话存储的更简洁的方法。您可以编写一个自定义模型绑定器,该绑定器可以将会话中的实例提供给您的操作方法。查一下。

【讨论】:

猜你喜欢
  • 2010-12-15
  • 2011-04-10
  • 1970-01-01
  • 2011-10-05
  • 2011-09-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多