веб-часть sharepoint со множеством пользовательских элементов управления - PullRequest
0 голосов
/ 30 марта 2012

Я создал визуальную веб-часть sharepoint 2010 в VisualStudio2010 с тремя пользовательскими элементами управления (.ascx). Я хочу динамически изменять пользовательский контроль в веб-части, нажимая какую-то кнопку в загруженном пользовательском контроле. Основная проблема заключается в том, что событие buttonClick обрабатывается только после выполнения метода CreateChildControls (где я пытаюсь получить необходимый контроль пользователя с помощью ViewData). Может ли кто-нибудь помочь мне решить эту проблему?

Ответы [ 3 ]

1 голос
/ 01 апреля 2012

Ответ Ли в основном правильный и может хорошо сработать для вас. Тем не менее, вы не должны просто использовать __doPostBack и полагаться, что он всегда будет «волшебным» для вас. Этот метод и переменные, упомянутые Ли, являются внутренними для ASP.NET и не предназначены для непосредственного использования. Кроме того, если вы не разместите на своей странице какой-либо элемент управления обратной передачей, этот метод на самом деле не будет сгенерирован, и ваш код, вызывающий его, потерпит неудачу.

К счастью, код для генерации и обработки обычной обратной передачи очень прост. Вместо использования встроенных обработчиков событий элементов управления вводом (которые должны быть сконструированы до запуска - следовательно, вызов CreateChildControls перед вызовом вашего обработчика) вы бы нацелили обратную передачу на саму веб-часть. :

public class MyWebPart : WebPart, IPostBackEventHandler {
    protected override void CreateChildControls() {
        Control clickable = ...; // Create a clickable control.
        // Get JavaScript expression to send postback "test" to "this" web part.
        var postBack = Page.ClientScript.GetPostBackEventReference(this, "test");
        clickable.Attributes["onclick"] = postBack + "; return false";
        Controls.Add(clickable);
    }

    void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
        if (eventArgument == "test") { // Recognize and handle our postback.
           ...
        }
    }
}

GetPostBackEventReference сгенерирует необходимое выражение JavaScript для вас. (И на самом деле, просто вызывая его, __doPostBack «магически» появляется на странице.) RaisePostBackEvent будет вызываться между OnLoad и OnPreRender. Следите за тем, чтобы дочерние элементы управления не создавались до этого (например, вызывая EnsureChildControls или любым другим способом). Если вам нужно несколько элементов управления обратной передачей, параметр eventArguments позволит вам отличаться между ними.

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

--- Ферда

0 голосов
/ 26 июня 2012

У меня тоже была эта проблема.

Добавьте это в обработчик событий (после выполнения вашего кода внутри обработчика)

this.Page.Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri, true);

С уважением,

Педро

0 голосов
/ 30 марта 2012

Один из способов сделать это - вызвать функцию javascript, которая, в свою очередь, вызывает следующее:

__doPostBack('LoadControl', 'ControlName');

Затем вы можете использовать серверные переменные __EVENTTARGET и __EVENTARGUMENT, чтобы узнать, какой элемент управления загрузить в обработчик событий CreateChildControls.

...