Правильно ли реализовать веб-часть с обратной передачей? - PullRequest
6 голосов
/ 17 февраля 2009

Я пытаюсь создать веб-часть с текстовым полем, в котором вы можете установить значение литерала (h2) на веб-части и кнопку «сохранить», которая отправляет сообщения назад, а затем соответственно устанавливает литерал. Это работает с одним огромным предостережением; когда страница загружается после обратной передачи, литерал не изменяется. Однако, если я записываю то, что на самом деле установлено в литерале, оно имеет новое значение. Кроме того, если я снова перезагрузить страницу (F5), она отображается правильно.

Сначала я подумал, что это должен быть ViewState, поэтому я отключил его для всех элементов управления. Я проверил, что это не сохраняется в ViewState (декодировал его). Таким образом, ViewState не сохраняет старое значение.

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

Есть идеи?

Для записи я использую MOSS 2007.

Ответы [ 4 ]

3 голосов
/ 17 февраля 2009

Похоже, проблема синхронизации событий ASP.NET. Попробуйте вызвать EnsureChildControls () в событии загрузки страницы. Это гарантирует, что ваш метод CreateChildControls () вызывается и ваши элементы управления добавляются на страницу перед обработкой событий обратной отправки. Если ваши элементы управления будут впервые добавлены на этапе PreRender или Render, будет слишком поздно для них, чтобы забрать данные обратной передачи. Тогда вы не увидите изменения до загрузки следующей страницы.

1 голос
/ 18 февраля 2009

Возможно, этот пост в блоге поможет вам лучше понять жизненный цикл веб-части и решить вашу проблему. http://platinumdogs.wordpress.com/2008/10/14/sharepoint-webpart-lifecycle-events/

0 голосов
/ 28 апреля 2009

Вот предложение. У меня все равно работает.

using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

namespace Skaar.UI
{
    public class PostBackWebPart:WebPart
    {
        private Literal literal;
        private TextBox textBox;
        protected override void OnInit(System.EventArgs e)
        {
            base.OnInit(e);
            literal=new Literal();
            literal.Mode = LiteralMode.PassThrough;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
            Controls.Add(literal);
            textBox=new TextBox();
            textBox.AutoPostBack = true;
            Controls.Add(textBox);
            textBox.TextChanged += textBox_TextChanged;                                                                                                                                                                                                                                                                                                                                      
        }

        void textBox_TextChanged(object sender, System.EventArgs e)
        {
            literal.Text = string.Format("<h1>{0}</h1>", textBox.Text);
        }
    }
}
0 голосов
/ 27 февраля 2009

Вы всегда можете использовать панель обновления AJAX, поместить в нее свой буквальный элемент управления и вызвать UDP.Update на панели обновлений. Также с вашим первоначальным примером проверки у вас есть runat="server" на вашем буквальном контроле. Вы должны иметь возможность добавить изменение в событие Page_Load, и оно должно появиться на веб-части.

...