Проблема с динамическими средствами управления в.NET

Я последовал за ответом Пека. Я проверил на своей локальной машине, и это сработало; однако, это все еще не работало в TravisCI, как показано в моих журналах:

TravisCI журналы .

Я даже установил тайм-аут ожидания на 11 секунд, и тесты все равно не прошли. Затем я увеличил allScriptsTimeout в protractor-docker.conf.js до 180000. После этого тесты прошли:

Мои журналы Travis CI об успешном угловом тесте E2E

Однако тестирование заняло 2 минуты и 10 секунд. Это расстраивает, потому что я просто проверял, появляется ли заголовок на панели навигации. Боюсь, что если я проверю что-то, например, форму и нажатие кнопок, Travis CI может даже занять больше времени.

14
задан torial 13 October 2008 в 02:34
поделиться

9 ответов

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

набор ViewState propeties во время события Init не поддержан к ViewState (потому что Страница еще не начала отслеживать ViewState). Таким образом Init является хорошим местом, чтобы добавить средства управления и установить (a) свойства, которые не изменятся между обратными передачами (идентификатор, CssClass...), а также начальные значения для динамических свойств (который может затем быть изменен кодом в остальной части жизненного цикла страницы - Загрузка, обработчики событий, PreRender).

При динамичном добавлении средств управления в Загрузке или PreRender, ViewState прослеживается. Разработчик может затем управлять, какие propeties сохраняются для динамично добавленных средств управления следующим образом:

  • набор Свойств перед управлением добавляется к дереву управления страницы, не сохраняются к ViewState. Вы обычно устанавливаете свойства, которые не являются динамическими (идентификатор и т.д.) прежде, чем добавить управление к дереву управления.

  • набор Свойств после управления добавляется к дереву управления страницы, сохраняются к ViewState (Отслеживание ViewState включено до События Загрузки к после события PreRender).

В Вашем случае, Ваш обработчик PreRender устанавливает свойства прежде, чем добавить управление к дереву управления страницы. Для получения результата, Вы хотите, устанавливаете динамические свойства после добавления управления к дереву управления:.

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);
    ValueLinkButton tempLink = new ValueLinkButton(); // [CASE 2]        
    tempLink.ID = "valueLinkButton"; // Not persisted to ViewState
    Controls.Clear();
    Controls.Add(tempLink);
    tempLink.Value = "new value";  // Persisted to ViewState
    tempLink.Text = "Click";       // Persisted to ViewState
}
19
ответ дан 1 December 2019 в 12:28
поделиться

Поскольку у других есть оператор, необходимо будет удостовериться, что создаете с помощью метода Init. Для получения дополнительной информации о жизненном цикле страницы ASP.NET проверяют эту статью: http://msdn.microsoft.com/en-us/library/ms178472.aspx

3
ответ дан 1 December 2019 в 12:28
поделиться

я уже воссоздаю средства управления в своем событии OnLoad.

Это - Ваша проблема. OnLoad является слишком поздним. Используйте Init вместо этого.

1
ответ дан 1 December 2019 в 12:28
поделиться

Спасибо за Вашу справку, но я попробовал это, и это не имело значения. Кроме того, OnLoad работает точно также на динамические средства управления как OnInit, пока Вы даете Вашим средствам управления те же идентификаторы каждый раз.

0
ответ дан 1 December 2019 в 12:28
поделиться

Я полагаю, что, после того как Вы добавили динамические средства управления к странице в PageLoad, ViewState связывается со средствами управления, и флаг "ViewState still needs to be bound" (в понятии, не фактическом флаге) очищен. Затем при воссоздании средств управления существующий ViewState больше не связывается.

я столкнулся с чем-то подобным в прошлом году, только в моем случае, который я не сделал , хотят ViewState снова переплести. Моя проблема - то, что я был не воссоздание предыдущих средств управления, который является, почему я думаю, что понятие псевдофлага выше применяется.

0
ответ дан 1 December 2019 в 12:28
поделиться

Попытайтесь звонить Page.RegisterRequiresControlState(). Можно также использовать RequiresControlState(), чтобы проверить, было ли это уже зарегистрировано.

0
ответ дан 1 December 2019 в 12:28
поделиться

ViewState работает на Странице и ее дочерних объектах. Новое управление в [Случай 2] не было добавлено к Странице (или ни один из ее детей). На самом деле, в случае кода выше, объект будет вне объема, как только метод OnPreRender заканчивается и будет собран "мусор".

, Если абсолютно необходимо выгрузить управление, необходимо будет удалить старое управление из его родительского использования, Удаляют () метод и добавляют новое управление при использовании правильного места AddAt ().

, Если бы управление было единственным ребенком родителя, код был бы чем-то как следующее.

ValueLinkButton tempLink = new ValueLinkButton();
Control parent = FindControl("valueLinkButton").Parent;
parent.Remove(FindControl("valueLinkButton"));
parent.AddAt(0, tempLink);
0
ответ дан 1 December 2019 в 12:28
поделиться

Управление, добавленное перед методом SaveViewState, названным в жизненном цикле управления, должно сохранить их значения. Я согласился бы с ответом Joe. Проверьте это изображение

http://emanish.googlepages.com/Asp.Net2.0Lifecycle.PNG

0
ответ дан 1 December 2019 в 12:28
поделиться

Вчера я понял, что вы можете заставить свое приложение работать как обычно, загрузив дерево управления сразу после событие loadviewstateevent запускается. если вы переопределите событие loadviewstate, вызовите mybase.loadviewstate, а затем поместите свой собственный код для повторного создания элементов управления сразу после него, значения этих элементов управления будут доступны при загрузке страницы. В одном из своих приложений я использую поле viewstate для хранения идентификатора или информации о массиве, которые можно использовать для воссоздания этих элементов управления.

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub
0
ответ дан 1 December 2019 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: