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

Shy*_*yju 9 asp.net postback

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

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

M4N*_*M4N 7

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

使用这种方法,您有几个优点:

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


Jur*_*uri 3

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

基本上你会有以下内容:

  1. 您显示一个空的网络表单,其中包含对象属性的字段(即文本框)
  2. 用户将填写表格并按保存
  3. 然后就会发生回发。在 PageLoad 上,您可以检测这是否是回发Page.IsPostback,如果是,则创建一个新对象并用用户输入的值填充它。
  4. 在按钮的 OnClick 中,调用适当的 BL 方法将其存储到数据库中

这看起来像(我是在没有编译器的情况下凭空写出来的,所以要小心:))

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我昨天想添加,但由于我必须赶时间而忘记了:
您也可以像其他人描述的那样将对象存储在 ViewState 或 Session 中,但我的经验是,由于以下“缺点”,应该尽可能少这样做“ (从我的观点):

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

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