Ajax, Обратный вызов, обратная передача и Sys. WebForms. PageRequestManager.getInstance () .add_beginRequest

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

Sys. WebForms. PageRequestManager.getInstance () .add_beginRequest (функция (отправитель, args) {var modalPopupBehavior = $find ('programmaticSavingLoadingModalPopupBehavior'); modalPopupBehavior.show ();});

UserControl размещается в detailsview, который является в 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 (функция (отправитель, args) {var modalPopupBehavior = $find ('programmaticSavingLoadingModalPopupBehavior'); modalPopupBehavior.show ();});

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

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

1
задан gdpwork 11 May 2010 в 22:49
поделиться

1 ответ

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

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

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

2
ответ дан 3 September 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: