Я последовал за ответом Пека. Я проверил на своей локальной машине, и это сработало; однако, это все еще не работало в TravisCI, как показано в моих журналах:
Я даже установил тайм-аут ожидания на 11 секунд, и тесты все равно не прошли. Затем я увеличил allScriptsTimeout
в protractor-docker.conf.js
до 180000. После этого тесты прошли:
Мои журналы Travis CI об успешном угловом тесте E2E
Однако тестирование заняло 2 минуты и 10 секунд. Это расстраивает, потому что я просто проверял, появляется ли заголовок на панели навигации. Боюсь, что если я проверю что-то, например, форму и нажатие кнопок, Travis CI может даже занять больше времени.
Поддержанные состоянием отображения свойства только сохраняются к 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
}
Поскольку у других есть оператор, необходимо будет удостовериться, что создаете с помощью метода Init. Для получения дополнительной информации о жизненном цикле страницы ASP.NET проверяют эту статью: http://msdn.microsoft.com/en-us/library/ms178472.aspx
я уже воссоздаю средства управления в своем событии OnLoad.
Это - Ваша проблема. OnLoad является слишком поздним. Используйте Init вместо этого.
Спасибо за Вашу справку, но я попробовал это, и это не имело значения. Кроме того, OnLoad работает точно также на динамические средства управления как OnInit, пока Вы даете Вашим средствам управления те же идентификаторы каждый раз.
Я полагаю, что, после того как Вы добавили динамические средства управления к странице в PageLoad, ViewState связывается со средствами управления, и флаг "ViewState still needs to be bound" (в понятии, не фактическом флаге) очищен. Затем при воссоздании средств управления существующий ViewState больше не связывается.
я столкнулся с чем-то подобным в прошлом году, только в моем случае, который я не сделал , хотят ViewState снова переплести. Моя проблема - то, что я был не воссоздание предыдущих средств управления, который является, почему я думаю, что понятие псевдофлага выше применяется.
Попытайтесь звонить Page.RegisterRequiresControlState()
. Можно также использовать RequiresControlState()
, чтобы проверить, было ли это уже зарегистрировано.
ViewState работает на Странице и ее дочерних объектах. Новое управление в [Случай 2] не было добавлено к Странице (или ни один из ее детей). На самом деле, в случае кода выше, объект будет вне объема, как только метод OnPreRender заканчивается и будет собран "мусор".
, Если абсолютно необходимо выгрузить управление, необходимо будет удалить старое управление из его родительского использования, Удаляют () метод и добавляют новое управление при использовании правильного места AddAt ().
, Если бы управление было единственным ребенком родителя, код был бы чем-то как следующее.
ValueLinkButton tempLink = new ValueLinkButton();
Control parent = FindControl("valueLinkButton").Parent;
parent.Remove(FindControl("valueLinkButton"));
parent.AddAt(0, tempLink);
Управление, добавленное перед методом SaveViewState, названным в жизненном цикле управления, должно сохранить их значения. Я согласился бы с ответом Joe. Проверьте это изображение
Вчера я понял, что вы можете заставить свое приложение работать как обычно, загрузив дерево управления сразу после событие loadviewstateevent запускается. если вы переопределите событие loadviewstate, вызовите mybase.loadviewstate, а затем поместите свой собственный код для повторного создания элементов управления сразу после него, значения этих элементов управления будут доступны при загрузке страницы. В одном из своих приложений я использую поле viewstate для хранения идентификатора или информации о массиве, которые можно использовать для воссоздания этих элементов управления.
Protected Overrides Sub LoadViewState(ByVal savedState As Object)
MyBase.LoadViewState(savedState)
If IsPostBack Then
CreateMyControls()
End If
End Sub