如何在ASP.NET页面回发之间维护对象?
我有一个ASP.NET网页.当我点击一个asp.net按钮时,我将调用我的函数(保存),它将创建我的自定义类(UserDetails类)的对象并将详细信息保存到DB.so这是一个邮寄回来.邮件再次返回后,同一页面将显示给用户.那时,我想要获取我在第一个函数中创建的User对象(Save).做这个的最好方式是什么 ?我知道我可以在会话中存储它并访问它.但我想知道还有其他更好的方法吗?
另一种选择是使用唯一键(例如"user"+ id)将对象存储在Cache中,并仅将其id存储在当前会话或ViewState中.在回发期间,您可以从缓存中检索对象.
使用这种方法,您有几个优点:
您正在寻找的方法是某种数据绑定机制,它将对象的值(如果已经存在,您可以从数据库加载)绑定到您的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
}
}
Run Code Online (Sandbox Code Playgroud)
我昨天想添加,但由于我必须赶时间而忘记了:
您也可以像其他人描述的那样将对象存储在 ViewState 或 Session 中,但我的经验是,由于以下“缺点”,应该尽可能少这样做“ (从我的观点):
我描述的“数据绑定”方法的优点是您不会遇到这些问题,但“缺点”是每次都有一个新的对象。因此,您必须注意处理对象状态,即通过往返等手动保留 id。
| 归档时间: |
|
| 查看次数: |
16497 次 |
| 最近记录: |