在没有Session或Query字符串的情况下在MVC2中保持状态的方法?

时间:2011-01-13 14:16:51

标签: asp.net-mvc asp.net-mvc-2 state

有没有办法在不使用会话变量或查询字符串的情况下在MVC2中保留帖子之间的信息?

5 个答案:

答案 0 :(得分:1)

您可以使用“隐藏表单”字段将值重新发送回服务器并提交每个表单。

答案 1 :(得分:1)

你的意思是.NET Web Forms中的视图状态?从技术上讲,虽然不推荐,但最好还是利用模型并将模型数据发布到服务器并将模型推回到视图中。

这样可以正常工作,但是如果你需要像WebForms ViewState那样有状态的东西,我建议你在WebForms中做你的项目或使用会话来保存你的模型。

编辑:构建将数据发布(或获取)回到同一页面的表单。然后在你的控制器中,有一个像这样的方法。

[HttpPost]
public ActionResult LoginUser(LoginViewModel model)
{
    //work on the model here
    return View(model);
}

这会将用户刚刚提交的表单数据推送到您的视图中。然后在你的视图中有一个这样的Html帮助器。

<%: Html.TextboxFor(m => Model.Username) %>

网上有很多关于在模型中使用html助手的优秀资源。谷歌周围,你会遇到他们。

答案 2 :(得分:0)

其他替代方案包括cookie或Http Cache - 什么阻止你使用会话?

答案 3 :(得分:0)

作为一个高级概念,您应该尽可能少地依赖Session来存储您的状态,而应该依赖于Web应用程序中的有状态。我们的想法是,网络本身在设计上是无状态的,在设计该范例的软件时,软件应该被设计为拥抱无国籍的性质。

更具体地说,使用ViewModel可以为您提供视图传递给客户端所需数据的强类型表示。可以通过多种方式将包含可以从该视图生成的给定请求的状态的信息的片段添加到视图中,但最直接的两个是:

  1. 作为隐藏表单字段元素
  2. 作为请求网址的一部分
  3. 查看NerdDinner教程,了解使用ViewData或强类型ViewModel的标准方法。一些Google搜索将一如既往地提供更多信息和教程。但请特别注意教程在视图中使用ViewModel属性的位置。这些可以在HTML呈现中的任何地方使用,可以在HTML帮助程序中使用,也可以在手动构建标记时使用。

    关于网络无状态的更多有趣的阅读(以及这整个非全新的人们似乎在思考的REST事物)是文章:How I Explained REST to My Wife

答案 4 :(得分:0)

如果您对Session变量的主要问题是实用性的(想要一些适用于单个请求的东西,而不需要担心清理它等)而不是要求不使用Session,那么请使用TempData字典。它处理仅在单个请求中将信息放入Session中,然后框架将自动为您删除它。