Ajax, Callback, postback и Sys.WebForms.PageRequestManager.getInstance (). Add_beginRequest - PullRequest
1 голос
/ 12 мая 2010

У меня есть пользовательский элемент управления, который инкапсулирует NumericUpDownExtender. Этот UserControl реализует интерфейс ICallbackEventHandler, потому что я хочу, чтобы при изменении пользователем значения текстового поля, связанного с настраиваемым событием, которое вызывалось на сервере. С другой стороны, каждый раз, когда выполняется асинхронная обратная передача, я загружаю сообщение о загрузке и отключаю весь экран. Это прекрасно работает, когда что-то изменяется, например, в UpdatePanel через следующие строки кода:

Sys.WebForms.PageRequestManager.getInstance (). Add_beginRequest ( function (sender, args) { var modalPopupBehavior = $ find ('programmaticSavingLoadingModalPopupBehavior'); modalPopupBehavior.show (); } );

UserControl помещается в подробное представление, которое находится внутри UpdatePanel в aspx. Когда вызывается пользовательское событие, я хочу, чтобы другое текстовое поле в aspx изменило его значение. Пока что, когда я нажимаю на UpDownExtender, он корректно переходит на сервер и вызывает пользовательское событие, и на сервере назначается новое значение текстового поля. но это не изменяется в браузере.

Я подозреваю, что проблема заключается в обратном вызове, так как у меня та же архитектура для UserControl с AutoCompleteExtender, который реализует IPostbackEventHandler, и он работает. Любые подсказки, как я могу решить это здесь, чтобы пользовательский элемент управления UpDownNumericExtender работал как AutComplete?

Это код пользовательского элемента управления и родительского элемента:

using System;
using System.Web.UI;
using System.ComponentModel;
using System.Text;

namespace Corp.UserControls
{
    [Themeable(true)]
    public partial class CustomNumericUpDown : CorpNumericUpDown, ICallbackEventHandler
    {
        protected void Page_PreRender(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                currentInstanceNumber = CorpAjaxControlToolkitUserControl.getNextInstanceNumber();
            }
            registerControl(this.HFNumericUpDown.ClientID, currentInstanceNumber);
            string strCallServer = "NumericUpDownCallServer" + currentInstanceNumber.ToString();

            // If this function is not written the callback to get the disponibilidadCliente doesn't work
            if (!Page.ClientScript.IsClientScriptBlockRegistered("ReceiveServerDataNumericUpDown"))
            {
                StringBuilder str = new StringBuilder();
                str.Append("function ReceiveServerDataNumericUpDown(arg, context) {}").AppendLine();
                Page.ClientScript.RegisterClientScriptBlock(typeof(CorpNumericUpDown),
                                                            "ReceiveServerDataNumericUpDown", str.ToString(), true);
            }

            nudeNumericUpDownExtender.BehaviorID = "NumericUpDownEx" + currentInstanceNumber.ToString();
            ClientScriptManager cm = Page.ClientScript;
            String cbReference = cm.GetCallbackEventReference(this, "arg", "ReceiveServerDataNumericUpDown", "");
            String callbackScript = "function " + strCallServer + "(arg, context)" + Environment.NewLine + "{" + Environment.NewLine + cbReference + ";" + Environment.NewLine + "}" + Environment.NewLine;
            cm.RegisterClientScriptBlock(typeof(CustomNumericUpDown), strCallServer, callbackScript, true);
            base.Page_PreRender(sender,e);
        }

        [System.ComponentModel.Browsable(true)]
        [System.ComponentModel.Bindable(true)]
        public Int64 Value
        {
            get { return (string.IsNullOrEmpty(HFNumericUpDown.Value) ? Int64.Parse("1") : Int64.Parse(HFNumericUpDown.Value)); }
            set
            {
                HFNumericUpDown.Value = value.ToString();
                //txtAutoCompleteCliente_AutoCompleteExtender.ContextKey = value.ToString();
                // TODO: Change the text of the textbox
            }
        }

        [System.ComponentModel.Browsable(true)]
        [System.ComponentModel.Bindable(true)]
        [Description("The text of the numeric up down")]
        public string Text
        {
            get { return txtNumericUpDown.Text; }
            set { txtNumericUpDown.Text = value; }
        }

        public delegate void NumericUpDownChangedHandler(object sender, NumericUpDownChangedArgs e);
        public event NumericUpDownChangedHandler numericUpDownEvent;

        [System.ComponentModel.Browsable(true)]
        [System.ComponentModel.Bindable(true)]
        [System.ComponentModel.Description("Raised after the number has been increased or decreased")]
        protected virtual void OnNumericUpDownEvent(object sender, NumericUpDownChangedArgs e)
        {
            if (numericUpDownEvent != null) //check to see if anyone has attached to the event 
                numericUpDownEvent(this, e);
        }

        #region ICallbackEventHandler Members

        public string GetCallbackResult()
        {
            return "";//throw new NotImplementedException();
        }

        public void RaiseCallbackEvent(string eventArgument)
        {
            NumericUpDownChangedArgs nudca = new NumericUpDownChangedArgs(long.Parse(eventArgument));
            OnNumericUpDownEvent(this, nudca);
        }

        #endregion
    }

    /// <summary>
    /// Class that adds the prestamoList to the event
    /// </summary>
    public class NumericUpDownChangedArgs : System.EventArgs
    {
        /// <summary>
        /// The current selected value.
        /// </summary>
        public long Value { get; private set; }

        public NumericUpDownChangedArgs(long value)
        {
            Value = value;
        }
    }

}


using System;
using System.Collections.Generic;
using System.Text;

namespace Corp
{
    /// <summary>
    /// Summary description for CorpAjaxControlToolkitUserControl
    /// </summary>
    public class CorpNumericUpDown : CorpAjaxControlToolkitUserControl
    {
        private Int16 _currentInstanceNumber; // This variable hold the instanceNumber assignated at first place.

        public short currentInstanceNumber
        {
            get { return _currentInstanceNumber; }
            set { _currentInstanceNumber = value; }
        }

        protected void Page_PreRender(object sender, EventArgs e)
        {
            const string strOnChange = "OnChange";
            const string strCallServer = "NumericUpDownCallServer";

            StringBuilder str = new StringBuilder();
            foreach (KeyValuePair<String, Int16> control in controlsToRegister)
            {
                str.Append("function ").Append(strOnChange + control.Value).Append("(sender, eventArgs) ").AppendLine();
                str.Append("{").AppendLine();
                str.Append("    if (sender) {").AppendLine();
                str.Append("        var hfield = document.getElementById('").Append(control.Key).Append("');").AppendLine();
                str.Append("        if (hfield.value != eventArgs) {").AppendLine();
                str.Append("           hfield.value = eventArgs;").AppendLine();
                str.Append("           ").Append(strCallServer + control.Value).Append("(eventArgs, eventArgs);").AppendLine();
                str.Append("        }").AppendLine();
                str.Append("    }").AppendLine();
                str.Append("}").AppendLine();
                Page.ClientScript.RegisterClientScriptBlock(typeof(CorpNumericUpDown), Guid.NewGuid().ToString(), str.ToString(), true);
            }

            str = new StringBuilder();
            foreach (KeyValuePair<String, Int16> control in controlsToRegister)
            {
                str.Append("    funcsPageLoad[funcsPageLoad.length] = function() { $find('NumericUpDownEx" + control.Value + "').add_currentChanged(").Append(strOnChange + control.Value).Append(");};").AppendLine();
                str.Append("    funcsPageUnLoad[funcsPageUnLoad.length] = function() { $find('NumericUpDownEx" + control.Value + "').remove_currentChanged(").Append(strOnChange + control.Value).Append(");};").AppendLine();
            }
            Page.ClientScript.RegisterClientScriptBlock(typeof(CorpNumericUpDown), Guid.NewGuid().ToString(), str.ToString(), true);
        }
    }
}

и для создания представления загрузки я использую это:

// Событие beginRequest возникает до того, как начинается обработка асинхронной обратной передачи, и обратная передача отправляется на сервер. Это событие можно использовать для вызова пользовательского сценария, чтобы установить заголовок запроса или запустить анимацию, которая уведомляет пользователя о том, что выполняется обратная передача. Sys.WebForms.PageRequestManager.getInstance (). Add_beginRequest ( function (sender, args) { var modalPopupBehavior = $ find ('programmaticSavingLoadingModalPopupBehavior'); modalPopupBehavior.show (); } );

// Событие endRequest возникает после завершения асинхронной обратной передачи и возвращения элемента управления в браузер. Это событие можно использовать для предоставления уведомления пользователям или для регистрации ошибок. Sys.WebForms.PageRequestManager.getInstance (). Add_endRequest ( function (sender, arg) { var modalPopupBehavior = $ find ('programmaticSavingLoadingModalPopupBehavior'); modalPopupBehavior.hide (); } );

Заранее спасибо! Daniel.

1 Ответ

2 голосов
/ 13 августа 2010

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

Насколько я понимаю, единственным ответом, отправляемым обратно в браузер клиента после выполнения обратного вызова веб-формы, является строка, возвращаемая GetCallbackResult. Затем создайте метод javascript с именем, совпадающим с параметром clientCallback, переданным в Page.ClientScript.GetCallbackEventReference, в вашем случае «ReceiveServerDataNumericUpDown».

Эта функция может затем выполнить обновление значения текстового поля на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...