ASP.NET: как я могу поддерживать объекты между постбэками? - PullRequest
9 голосов
/ 19 сентября 2009

Как я могу поддерживать объекты между постами обратно на странице ASP.NET?

У меня есть веб-страница ASP.NET. Когда я нажимаю одну кнопку asp.net, я вызываю свою функцию (Сохранить), которая создает объект моего пользовательского класса (класс UserDetails) и сохраняет детали в DB.so это сообщение назад. После этого сообщения пользователю снова будет показана та же страница. В то время я хочу взять объект User, который я создал в первой функции (Сохранить). Каков наилучший способ сделать это? Я знаю, что могу сохранить это в сеансе и получить к нему доступ. Но я хочу знать, есть ли другой лучший способ?

Ответы [ 4 ]

7 голосов
/ 19 сентября 2009

Другой вариант - сохранить объект в кэше с использованием уникального ключа (например, «user» + id) и сохранить его идентификатор только в текущем сеансе или в ViewState. Во время обратной передачи вы можете извлечь объект из кэша.

При таком подходе у вас есть несколько преимуществ:

  • у вас меньше данных в сеансе или в ViewState
  • если выполняется обратная передача, доступ к БД возможен только в том случае, если объект больше не находится в кэше
  • если не выполняется обратная передача, объект в конечном итоге будет удален из кэша (освобождая память)
3 голосов
/ 19 сентября 2009

Подход, который вы ищете, это какой-то механизм привязки данных, который связывает значения объекта (вы можете загрузить из БД, если он уже существует) с вашей веб-формой asp.net.

В основном у вас будет следующее:

  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
    }
}

То, что я хотел добавить вчера, но забыл, так как мне пришлось поторопиться:
Вы также можете хранить свои объекты в ViewState или Session, как описано другими, но я понял, что это следует делать как можно реже из-за следующих «недостатков» (с моей точки зрения):

  • Ваши объекты должны быть сериализуемыми
  • Хранение в ViewState значительно увеличит размер вашей страницы и тем самым замедлит загрузку вашей страницы. Обратите внимание, что ViewState передается клиенту и обратно каждый раз, когда происходит «обратная передача». Если это единственная возможность и вы испытываете проблемы с производительностью, вы можете попробовать это (но это должно быть исключением !!)
  • Хранение объектов в вашем сеансе может создать нагрузку на стороне сервера, занимая там память. Вы должны быть осторожны при хранении объектов во время сеанса и, возможно, также заботиться об уничтожении этих объектов, если знаете, что они вам больше не нужны.

Преимущество подхода «привязки данных», который я описал, состоит в том, что у вас нет этих проблем, с «недостатком» наличия нового свежего объекта каждый раз. Поэтому вам нужно позаботиться о том, чтобы обрабатывать состояние вашего объекта, то есть вручную сохранять идентификаторы в обходах и т. Д.

3 голосов
/ 19 сентября 2009

Вы можете сохранить объект во ViewState, это будет хранилище для конкретной страницы. Затем объект будет сериализован и введен в состояние просмотра страницы, что увеличит размер страницы.

Сохраняя объект в сеансе, вы уменьшаете размер страницы, но потребляете ресурсы памяти сервера.

Кроме того, вы можете каждый раз читать объект из базы данных. Это будет иметь преимущество в отображении пользователю именно того, что было сохранено в базе данных.

0 голосов
/ 19 сентября 2009

In UI Do this

    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; 
}
...