如何在ASP.NET页面回发之间维护对象?
我有一个ASP.NET网页。当我点击一个asp.net按钮时,我将调用我的函数(Save),它将创建我的自定义类的对象(UserDetails类)并将详细信息保存到DB.so这是一个帖子回来。在帖子后面再次显示相同的页面将显示给用户。那时,我想要在第一个函数(保存)中创建我创建的User对象。做这个的最好方式是什么 ?我知道我可以将它存储在会话中并访问它。但我想知道还有其他更好的方法吗?
答案 0 :(得分:7)
另一种选择是使用唯一键(例如“user”+ id)将对象存储在Cache中,并仅将其id存储在当前会话或ViewState中。在回发期间,您可以从缓存中检索对象。
通过这种方法,您可以获得以下几个优势:
答案 1 :(得分:3)
您可以将对象存储在ViewState中,这将是特定于页面的存储。然后,该对象将被序列化并注入页面视图状态,这将使页面更大。
通过将对象存储在会话中,可以使页面保持较小但占用服务器内存资源。
或者,您可以每次从数据库中读取对象。这样做的好处是可以准确地向用户显示数据库中保存的内容。
答案 2 :(得分:3)
您正在寻找的方法是某种数据绑定机制,它将对象的值(如果已经存在,可以从db加载)绑定到您的asp.net webform。
基本上你有以下内容:
Page.IsPostback
的回发,如果是,则创建一个新对象并用用户输入的值填充它。这看起来像(我在没有编译器的情况下写出来,所以要小心:))
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中,但我已经体验过,由于以下“缺点”(从我的角度来看),它应该尽可能少地完成:
我所描述的“数据绑定”方法的优点是你没有这些问题,每次都有一个新的新对象的“缺点”。因此,您必须注意处理您的对象状态,即通过往返等手动保持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;
}