Поток событий Sharepoint вызывает у меня проблемы - PullRequest
1 голос
/ 16 января 2012

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

На данный момент у меня есть визуальная веб-часть, в которой есть кнопка и элемент управления для простого вывода текста.Поэтому я сделал себе объект тестовой модели (простой объектный класс с именем CounterModel со свойством int), чтобы я мог легко отслеживать его с помощью состояния просмотра.

Так что в функции init моей веб-части япроверьте, равен ли ViewState[ID_COUNTER_MODEL] ноль.Если это так, я создаю новый CounterModeland и добавляю его в viewstate, а если он не нулевой, я просто добавляю свой ViewState[ID_COUNTER_MODEL] в свое личное свойство типа CounterModel.

После инициализации, которую я добавляюпрослушиватель событий типа щелчка мышью по кнопке.Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю кнопку, форма удаляется, воссоздается, а затем вызывает мой прослушиватель событий, что приводит к переназначению моего CounterModelobject из ViewState[ID_COUNTER_MODEL].Таким образом, любые изменения в слушателе событий никогда не регистрируются.Что я делаю неправильно и как мне следует обращаться с подобными ситуациями.

Вот пример кода:

Объект TestCounter

class CounterModel
{
    public int number;

    public CounterModel() {
        number = 0;
    }
}

Визуальная веб-часть

private CounterModel counterModel;

public CounterWebPart() {
    if (ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL] != null){
        counterModel = (CounterModel)ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL];
    } else {
        counterModel = new CounterModel();
        ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL] = counterModel;
    }
}

    protected override void CreateChildControls(){
        CounterWebPartUserControl control = (CounterWebPartUserControl)Page.LoadControl(_ascxPath);
        Controls.Add(control);

        control.GetBtnChangeLabel().Click += OnBtnChangeLabelClicked;
        control.GetLabel().Text = counterModel.number.ToString();
    }



    public void OnBtnChangeLabelClicked(object sender, EventArgs e) {
        counterModel.number++;
        (CounterModel)ViewState[CounterPropertiesIndexes.ID_COUNTER_MODEL] = counterModel;
    }

1 Ответ

1 голос
/ 17 января 2012

Это не проблема с моделью событий SharePoint, это проблема с моделью событий ASP.Net WebForms.Посмотрите на http://msdn.microsoft.com/en-us/library/ms178472.aspx для получения дополнительной информации, но ViewState никогда не будет заполнен в конструкторе вашего элемента управления, поэтому вы всегда создаете новый counterModel - поэтому вы не видите увеличения числа.Попробуйте запустить этот код в OnLoad.

. Кроме того, вы не должны полагаться на то, что CreateChildControls вызывается относительно ваших обработчиков событий (при определенных условиях он вызывается в разных точках процесса).Его следует использовать для создания элементов управления, добавления их в дерево и передачи событий.То есть.не звоните control.GetLabel().Text = counterModel.number.ToString(); тогда, сделайте это в OnPreRender.

...