我正在开发一个 CRUD ASP.NET WebForms Web 应用程序,该应用程序由用户填写数据的几个页面组成。我的客户不想将实体存储在页面之间的数据库中,直到用户单击最后一页上的完成(出于各种原因)。有哪些选项可以在页面之间传播填充的数据,哪个最不坏?从我的阅读中我看到可以使用 ViewState 和 Server.Transfer。任何其他选项,最好使用更少的魔术字符串和更多类型安全的数据绑定到实体对象?
4 回答
您可以将客户端应用程序中使用的所有对象存储在 中Session
,然后当用户单击完成时,您将这些对象发送到服务/方法,您可以将它们转换为实体,然后将它们提交到数据库。
使用ViewState
将显着增加您通过网络发送的数据量,因为所有Viewstate
数据都被序列化为表单中的隐藏输入,因此当您添加对象时,您的 HTTP 请求响应将显着增长。
这真的没有灵丹妙药。如果您的数据不太复杂,我会将值存储在查询字符串中。如果您的对象变得复杂且庞大,并且您想保持类型安全,我会使用Session
,但请记住自己清理!
另一个选择是使用 MVC 范例并使用隐藏输入以它自己的形式存储值。这意味着如果用户中途出错,您无需担心清理会话,但它也可以保持查询字符串干净。
认为这就是你所有的选项,查询字符串,视图状态(不要这样做),会话或隐藏变量。
好的,所以你必须序列化你的数据,所以你不能持久化上下文。这不是可序列化的,因此以上是您的选择:
他们每个人都有正面和负面的,
- Viewstate(低效但易于使用)
- 查询字符串(对大型数据集有效但不切实际且可编辑)
- 会话(增加服务器负载并需要清理,但允许您仅在服务器上保留数据)
- 隐藏变量(对用户隐藏但比视图状态更有效,需要为每个属性提供大量隐藏输入)
任你选!
使用内存缓存。
互联网上有大量的例子。
试试这个:
使用 Memcached 实现分布式缓存
不知道我做错了什么,但我的 ASP Web API 控制器没有可用的会话状态?我这样做了:(1) 转到定义了该静态类的 WebApiConfig 文件,因为我想要一些在我的控制器被调用之前运行一次的代码块。在那里,我添加了一个公共静态 List 变量 myList。(2) 然后在 Register 方法中,我完成了该列表的定义。(3) 现在在我的控制器中,我有一个持久的(只要我不重新启动应用程序)列表,我也可以读写。
public static class WebApiConfig
{
public static List<Note> myList;
public static void Register(HttpConfiguration config)
{
myList = new List<Note>();
myList.Add(new Note { Id = "1", Subject = "Wake up", Details = "Set alarm of 7:00 am and get out of bed." });
myList.Add(new Note { Id = "2", Subject = "Eat breakfast", Details = "Eat a healthy breakfast." });
myList.Add(new Note { Id = "3", Subject = "Go to work", Details = "Get to work before 9:00 am." });
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
... more code
然后在控制器中
public Note Save(Note newNote)
{
WebApiConfig.myList.Add(newNote);
return newNote;
}