Пользовательские элементы управления на одной странице, заполняющие проблему элементов управления - PullRequest
1 голос
/ 19 августа 2011

Этот вопрос продолжается с двух предыдущих вопросов, которые я написал:

1) Как получить переменные из .ascx в другом .ascx?

2) C # asp.net textbox.text не задается?

Мой третий вопрос в связи с этим - когда я создаю сеанс и анализирую информацию из ParentControl в ChildControl, а затем пытаюсь проанализировать другую информацию в другойэкземпляр ChildControl копирует значения из второго дочернего элемента управления в первый дочерний элемент управления.

Обновление: отображение страницы .ascx, которую я пропустил, может быть уместным.

ParentControl.ascx

<asp:PlaceHolder runat="server" id="ShowHideControls" Visible="false">    
    <asp:PlaceHolder runat="server" id="instanceOne" Visible="false">
        <uc1:ChildControl ID="controlOne" runat="server" />
    </asp:PlaceHolder>        
    <asp:PlaceHolder runat="server" id="instanceTwo" Visible="false">
        <uc1:ChildControl ID="controlTwo" runat="server" />
    </asp:PlaceHolder>
</asp:PlaceHolder>

ParentControl.ascx.cs

public void CreateSessionsAddressString(User user)
{
    if (user == user)
        Session["user"] = user;
}

instanceOne ChildControl.ascx.cs

public void SetUserDetails()
{   
    User user = Session["user"] as User;
    string fullAddress = User.fullAddress;
}

Теперь, если у меня есть второй экземпляртот же пользовательский элемент управления используется следующий код.

instanceTwo ChildControl.ascx

public void SetUserDetails()
{   
    User user = Session["user"] as User;
    string fullAddress = user.fullAddress;
}

В instanceTwo, когда вызывается метод set для обновления информации, instanceOne, кажется, заполняетсяСам с данными из экземпляра два.как я могу предотвратить это?


Обновление: добавлена ​​дополнительная информация, чтобы помочь решить проблему ниже.

Итак, в нашем решении есть пользователь, у которого естьучетная запись, каждая учетная запись может иметь одного дополнительного пользователя.Я выполняю проверку, чтобы убедиться, что user1 и user2 не равны null.

Если user1 равен true, а user2 равен null, то у меня нет проблемы.Когда user1 & user2 имеют значение true, у меня возникает проблема с получением информации, потому что, когда я вызываю метод для получения информации о пользователе, кажется, что она перезаписывает информацию user1 в пользовательском элементе управления.

Мне нужно, поскольку некоторые пользователи предложили обернуть код так, чтобы он влиял только на себя, а не на другие элементы управления на той же странице.Я собираюсь рассмотреть некоторые из предложений сегодня и попытаться вернуться к вашим комментариям как можно скорее.


Обновление Я сослался на более ранний вопрос, который я задал

1) Как получить переменные из .ascx в другом .ascx?

Полагаю, поздний вечер пятницы - не самое лучшее время, я в основном создал публичный метод в дочернем контролеи в родительском контроле я могу вызывать открытый метод для каждого экземпляра, чтобы я мог просто набрать:

  instanceOne.MyMethod();
  instanceTwo.MyMethod();

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

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Я думаю, что вы столкнулись с этой проблемой, потому что вы извлекаете объект пользователя из сеанса, а созданный вами экземпляр пользователя по-прежнему указывает на ссылку на объект, сохраненную в сеансе.

Попробуйте что-то вроде этого:

string fullAddress = String.Copy(User.FullAddress);

И вы тоже можете попробовать что-то вроде этого:

private string fullAddress;
public string FullAddress
{
    get { return fullAddress; }
    set { fullAddress = String.Copy(value); }
}

public void SetUserDetails()    
{           
    User user = Session["user"] as User;        
    this.FullAddress = user.fullAddress;   

    this.FullAddress = "Hello world!"; 
}
1 голос
/ 19 августа 2011

В instanceTwo, когда метод set вызывается для обновления информации, instanceOne, похоже, заполняется данными из instanceTwo.

Если ваша операция set обновляет экземпляр User вСеанс, затем при обратной передаче вы увидите это обновление в обоих элементах управления , если ваш код вызывает childControl.SetUserDetails().Попробуйте обернуть ваши вызовы в SetUserDetails() в блоке if(!Page.IsPostBack) или создать два отдельных экземпляра в сеансе, которые вы можете обновить.Если вы устанавливаете значения на дочерних элементах управления только при начальной загрузке страницы, то при обратной передаче вы должны увидеть другие значения.

Также обратите внимание, что я просто пытаюсь ответить на вопрос в том виде, в котором он задан.Возможно, здесь есть лучший дизайн, но я не совсем понимаю, чего вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...