ASP.NET:如何在回发之间维护对象?

时间:2009-09-19 10:43:46

标签: asp.net postback

如何在ASP.NET页面回发之间维护对象?

我有一个ASP.NET网页。当我点击一个asp.net按钮时,我将调用我的函数(Save),它将创建我的自定义类的对象(UserDetails类)并将详细信息保存到DB.so这是一个帖子回来。在帖子后面再次显示相同的页面将显示给用户。那时,我想要在第一个函数(保存)中创建我创建的User对象。做这个的最好方式是什么 ?我知道我可以将它存储在会话中并访问它。但我想知道还有其他更好的方法吗?

4 个答案:

答案 0 :(得分:7)

另一种选择是使用唯一键(例如“user”+ id)将对象存储在Cache中,并仅将其id存储在当前会话或ViewState中。在回发期间,您可以从缓存中检索对象。

通过这种方法,您可以获得以下几个优势:

  • 您的会话或ViewState中的数据较少
  • 如果进行了回发,则只需在对象不再位于缓存中时访问数据库
  • 如果没有回发,最终将从缓存中删除对象(释放内存)

答案 1 :(得分:3)

您可以将对象存储在ViewState中,这将是特定于页面的存储。然后,该对象将被序列化并注入页面视图状态,这将使页面更大。

通过将对象存储在会话中,可以使页面保持较小但占用服务器内存资源。

或者,您可以每次从数据库中读取对象。这样做的好处是可以准确地向用户显示数据库中保存的内容。

答案 2 :(得分:3)

您正在寻找的方法是某种数据绑定机制,它将对象的值(如果已经存在,可以从db加载)绑定到您的asp.net webform。

基本上你有以下内容:

  1. 您将显示一个空的网络表单,其中包含对象属性的字段(即文本框)
  2. 用户将填写表格并按保存
  3. 然后回发将会发生。在PageLoad上,您可以检测到这是否是Page.IsPostback的回发,如果是,则创建一个新对象并用用户输入的值填充它。
  4. 在按钮的OnClick中,您可以调用相应的BL方法将其存储到数据库
  5. 这看起来像(我在没有编译器的情况下写出来,所以要小心:))

    public partial class MyPage : Page
    {
    
        private Person myPersonObj;
    
        protected void Page_Load(...)
        {
    
            if(!Page.IsPostback)
            {
                //this is not a postback, so you may load an object based on an ID (i.e. in QueryString or create a new one
                myPersonObj = new Person();
            }
            else
            {
                //it is a postback, so unbind the values
                myPersonObj = new Person();
                Unbind(); //the myPersonObj will be filled, the values are managed by ASP.net in the ViewState
            }
    
        }
    
        //caution, overriding Page.DataBind()
        private override void DataBind()
        {
            textBoxFirstname.Text = myPersonObj.FirstName;
            ...
    
        }
    
        private void Unbind()
        {
            myPersonObj.FirstName = textBoxFirstname.Text;
        }
    
        protected void btnSubmit_OnClick(...)
        {
            if(Page.IsValid)
            {
                Save();
            }
        }
    
        private void Save()
        {
             //ideal layering with Interfaces
             IPersonBL personBL = MyBLFactory.Get<IPersonBL>();
             personBL.SavePerson(myPersonObj); //call the BL for further validation and then persisting
        }
    }
    

    我昨天要添加的内容,但因为我不得不赶紧忘记了:
    您也可以像其他人描述的那样将对象存储在ViewState或Session中,但我已经体验过,由于以下“缺点”(从我的角度来看),它应该尽可能少地完成:

    • 您的对象需要可序列化
    • 在ViewState中存储会大幅增加页面大小,从而减慢页面加载速度。请注意,每次发生“回发”时,ViewState都会传输到客户端并返回。如果这是唯一的可能性并且您遇到性能问题,您可以考虑trying this(但这应该是例外!!)
    • 在会话中存储对象可能会将负载放在服务器端,从而消耗内存。你应该小心地在你的会话中存储对象,如果你不知道它们不再需要它们,也可能会关心这些对象的破坏。

    我所描述的“数据绑定”方法的优点是你没有这些问题,每次都有一个新的新对象的“缺点”。因此,您必须注意处理您的对象状态,即通过往返等手动保持id。

答案 3 :(得分:-1)

在UI中执行此操作

    UserDetail userDetail = new UserDetail();
    //do your stuff
    userDetail = UserBL.TransferUserData(userDetail);

    //do your stuff

在BL

public static UserDetail TransferUserData(UserDetail userDetail )
{
    // do your processing on userDetail
    return UserDAL.TransferUserData(userDetail);
}

在DAL

public static UserDetail TransferUserData(UserDetail userDetail)
{

    //do your processing of db
    return userDetail; 
}