3

我正在开发一个 CRUD ASP.NET WebForms Web 应用程序,该应用程序由用户填写数据的几个页面组成。我的客户不想将实体存储在页面之间的数据库中,直到用户单击最后一页上的完成(出于各种原因)。有哪些选项可以在页面之间传播填充的数据,哪个最不坏?从我的阅读中我看到可以使用 ViewState 和 Server.Transfer。任何其他选项,最好使用更少的魔术字符串和更多类型安全的数据绑定到实体对象?

4

4 回答 4

2

您可以将客户端应用程序中使用的所有对象存储在 中Session,然后当用户单击完成时,您将这些对象发送到服务/方法,您可以将它们转换为实体,然后将它们提交到数据库。

于 2012-12-10T14:01:33.030 回答
2

使用ViewState将显着增加您通过网络发送的数据量,因为所有Viewstate数据都被序列化为表单中的隐藏输入,因此当您添加对象时,您的 HTTP 请求响应将显着增长。

这真的没有灵丹妙药。如果您的数据不太复杂,我会将值存储在查询字符串中。如果您的对象变得复杂且庞大,并且您想保持类型安全,我会使用Session,但请记住自己清理!

另一个选择是使用 MVC 范例并使用隐藏输入以它自己的形式存储值。这意味着如果用户中途出错,您无需担心清理会话,但它也可以保持查询字符串干净。

认为这就是你所有的选项,查询字符串视图状态(不要这样做)会话隐藏变量

好的,所以你必须序列化你的数据,所以你不能持久化上下文。这不是可序列化的,因此以上是您的选择:

他们每个人都有正面和负面的,

  • Viewstate(低效但易于使用)
  • 查询字符串(对大型数据集有效但不切实际且可编辑)
  • 会话(增加服务器负载并需要清理,但允许您仅在服务器上保留数据)
  • 隐藏变量(对用户隐藏但比视图状态更有效,需要为每个属性提供大量隐藏输入)

任你选!

于 2012-12-10T14:03:57.100 回答
1

使用内存缓存。
互联网上有大量的例子。
试试这个:
使用 Memcached 实现分布式缓存

于 2012-12-10T15:15:04.073 回答
0

不知道我做错了什么,但我的 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;
}
于 2021-03-03T18:53:15.273 回答