Скрытое поле не загружается из состояния просмотра поста обратно в родительский пользовательский элемент управления - PullRequest
1 голос
/ 10 января 2011

У меня есть родительский элемент управления, который имеет экземпляр дочернего элемента управления HiddenField.Я использую CreateChildControls (), чтобы добавить его.Все работает на стороне клиента, включая значения, добавляемые в поле.Однако при обратной передаче ссылка на поле равна нулю

, здесь указан код

    protected override void CreateChildControls()
    {
        assignedListField = new HiddenField();
        assignedListField.ID = ClientID + "_HiddenAssignedList";
        assignedListField.EnableViewState = true;

        Controls.Add(assignedListField);
        base.CreateChildControls();
    }

    public IList<DlpItem> GetAssignedItems()
    {
        //assignedListField = FindControl(ClientID + "_HiddenUnassignedList") as HiddenField;
        var TmpAssignedItems = new List<DlpItem>();
        var list = assignedListField.Value;
        var items = list.Split(new string[] { "#" }, StringSplitOptions.RemoveEmptyEntries);
        foreach (var item in items)
        {
            var mix = item.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
            var text = mix[0];
            var id = int.Parse(mix[1]);
            TmpAssignedItems.Add(new DlpItem(text, id));
        }
        return TmpAssignedItems;
    }

Я пытался просто полагаться на ViewState ..., а затем пытался использовать FindControl ().Ни то, ни другое не работает, это выглядит как нулевая ссылка ... какие-либо данные о том, что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 10 января 2011

Как сказал @Sebastian, если вам нужно использовать какой-либо из элементов управления, они могут быть нулевыми, потому что они недоступны. Однако вы можете вызвать EnsureChildControls, чтобы создать коллекцию элементов управления и убедиться в ее наличии. Это не включает загрузку ViewState.

Однако вы не можете полагаться на состояние представления, если у вас есть операции на стороне клиента, влияющие на данные. Что вам нужно сделать, это чтобы ваш элемент управления реализовал IPostBackDataHandler. В LostPostData вам нужно проверить наличие скрытой переменной. Используя postCollection [ClientID + "_HiddenAssignedList"], вы можете получить строковое значение, отправленное на сервер, и обработать результаты.

НТН.

0 голосов
/ 10 января 2011

Скорее всего, CreateChildControls() еще не был вызван при загрузке ViewState (вероятно, в вашем случае ControlState более полезен).

См. http://msdn.microsoft.com/en-us/library/aa719775%28vs.71%29.aspx о жизненном цикле выполнения.

Вы можете сохранить (и загрузить) состояние, используя LoadViewState (SaveViewState) - метод (http://msdn.microsoft.com/de-de/library/system.web.ui.control.loadviewstate.aspx) и сохранять значения в полях до тех пор, пока не будет вызван CreateChildControls().

...