Asp.net пользовательский элемент управления и функция javascript

#javascript #asp.net #custom-controls

#javascript #asp.net #пользовательские элементы управления

Вопрос:

Существует пользовательский asp.net элемент управления с именем PhoneTextBox2. Он использует ext.net библиотека, но это не имеет значения.

 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PhoneTextBox2.ascx.cs"
    Inherits="Loginet.Web.Controls.PhoneTextBox2" %>

 <script type="text/javascript">
               var <%=ClientID%>_getNumber = function () {
                return alert( 'some value');
            }
        </script>
<ext:CompositeField runat="server" ID="eCompositeField">
        <Items>
            <ext:Label ID="PhoneBoxTitle" runat="server" />
        </Items>
</ext:CompositeField>
  

На странице aspx я вызываю метод javascript PhoneTextBox2 таким образом

 <uc:PhoneTextBox2 runat="server" ID="txtb" />
<ext:Button Text="test" runat="server">
        <Listeners>
            <Click Handler="#{txtb}_getNumber();"></Click>
        </Listeners>
</ext:Button>
  

#{txtb}_getNumber() это уникальное имя функции javascript, и #{txtb} — это уникальное имя функции PhoneTextBox2 .

Что я могу сделать, чтобы вызвать getNumber по точке?

 <Click Handler="#{txtb}.getNumber();">
  

Обновить:

     public partial class PhoneTextBox2 : System.Web.UI.UserControl {
            /// <summary>
            /// Допускаются ли, чтобы все поля были пустыми
            /// True - Допускаются. Используется тогда, когда данные из этого контрола необязательные.
            /// </summary>
            public bool EnableEmptyValues { get; set; }
            public string Title { get; set; }
            protected void Page_Load(object sender, EventArgs e) {

                txtCountryCode.AllowBlank = EnableEmptyValues;
                txtCityCode.AllowBlank = EnableEmptyValues;
                txtMainPhoneNumber.AllowBlank = EnableEmptyValues;

                if (!IsPostBack amp;amp; !Ext.Net.ExtNet.IsAjaxRequest) {
                    PhoneBoxTitle.Text = Title;
                    if (!string.IsNullOrWhiteSpace(DataSource)) {

                        string[] phoneNumberArray = DataSource.Split('-');
                        if (phoneNumberArray.Length >= _standartDimension) {
                            txtCountryCode.Text = phoneNumberArray[0];
                            if (txtCountryCode.Text[0] == _plus) {
                                txtCountryCode.Text = txtCountryCode.Text.Remove(0, 1);
                            }
                            txtCityCode.Text = phoneNumberArray[1];
                            txtMainPhoneNumber.Text = phoneNumberArray[2];
                            if (phoneNumberArray.Length >= _extraDimension) {
                                txtExtraPhoneNumber.Text = phoneNumberArray[3];
                            }
                        }
                    }
                }
            }


            public string DataSource { get; set; }


            private const string _phoneNumberMask = " {0}-{1}-{2}-{3}";
            private const char _plus = ' ';
            private const int _standartDimension = 3;
            private const int _extraDimension = 4;

            public string Number {
                get {
                    if (!string.IsNullOrWhiteSpace(txtCountryCode.Text) amp;amp;
                        !string.IsNullOrWhiteSpace(txtCityCode.Text) amp;amp;
                        !string.IsNullOrWhiteSpace(txtMainPhoneNumber.Text)) {

                        //Если добавочный номер пустой, то возвратить значения без него
                        if (!string.IsNullOrWhiteSpace(txtExtraPhoneNumber.Text))
                            return string.Format(_phoneNumberMask, txtCountryCode.Text, txtCityCode.Text, txtMainPhoneNumber.Text, txtExtraPhoneNumber.Text);

                        string phoneNumber = string.Format(_phoneNumberMask, txtCountryCode.Text, txtCityCode.Text, txtMainPhoneNumber.Text, string.Empty);
                        return phoneNumber.Remove(phoneNumber.Length - 1);

                    }
                    return string.Empty;
                }
            }


            public bool IsEmpty {
                get {
                    return (string.IsNullOrWhiteSpace(txtCountryCode.Text) amp;amp;
                            string.IsNullOrWhiteSpace(txtCityCode.Text) amp;amp;
                            string.IsNullOrWhiteSpace(txtMainPhoneNumber.Text) amp;amp;
                            string.IsNullOrWhiteSpace(txtMainPhoneNumber.Text));
                }
            }




            /// <summary>
            /// Validate 
            /// </summary>
            public void Validate() {
                if (EnableEmptyValues) {
                    if (!IsEmpty amp;amp; Number == string.Empty)
                        MarkInvalid();
                    else
                        MarkValid();
                }

                else {
                    if (IsEmpty)
                        MarkInvalid();
                    else {
                        if (Number == string.Empty)
                            MarkInvalid();
                        else
                            MarkValid();
                    }
                }
            }

            public void MarkInvalid(string msg = null) {
                txtCountryCode.MarkInvalid(msg);
                txtCityCode.MarkInvalid(msg);
                txtMainPhoneNumber.MarkInvalid(msg);
                txtExtraPhoneNumber.MarkInvalid(msg);

            }

            public void MarkValid() {
                txtCountryCode.MarkAsValid();
                txtCityCode.MarkAsValid();
                txtMainPhoneNumber.MarkAsValid();
                txtExtraPhoneNumber.MarkAsValid();
            }


             public const string InvalidCheckBoxCssStyle = "border-color:#C30; background:  url('/extjs/resources/images/default/grid/invalid_line-gif/ext.axd') repeat-x scroll center bottom white; width: 40px !important;";
         public const string ValidCheckBoxCssStyle = "border-color:#000; background: none repeat scroll 0 0 transparent;";
}
  

Обратите внимание, что в моем случае я не могу использовать свойство на стороне сервера Number из-за особенности ext.net . Поэтому мне нужно использовать javascript для получения Number .

Ответ №1:

Handler указывает на пользовательский метод / делегат .NET, и в их именах не может быть знаков точки.


Вы можете расширить любой тип объекта, например:

 String.prototype.getNumber = function() { 
  alert('here: '   this);
};
  

и затем

 'txtElement'.getNumber();
  

таким образом, вы можете изменить свой код на

 <Click Handler="'{txtb}'.getNumber();">
  

Комментарии:

1. Обработчик указывает на пользовательскую функцию javascript или стандартную ext.net функция javascript .

2. должен быть какой-то код, я не понимаю, почему # там знак хэша… :-/

3. #{txtb} используется в ext.net . Это то же самое, что и <%=txtb.ClientID%>

4. Могу ли я расширить PhoneTextBox2? Это что-то вроде этого PhoneTextBox2.prototype.getNumber = function() { alert('here: ' this); };

5. при расширении prototype вам просто нужно поместить код один раз, обычно в файл javascript plugin.js , который вызывается на главной странице. Я вижу, что вы не знаете, что делает мой код … если вы не можете указать на исходный код элемента управления, я не смогу вам помочь.

Ответ №2:

Нет необходимости назначать динамическое имя вашей функции javascript. Просто зарегистрируйте метод при создании первого элемента управления и проверьте, зарегистрирован ли он уже при создании следующего экземпляра элемента управления.

Регистрация блока скрипта:

 if (!Page.ClientScript.IsClientScriptBlockRegistered("getNumberScript"))
    Page.ClientScript.RegisterClientScriptBlock(GetType(), "getNumberScript", "getNumber = function () { return alert( 'some value'); }", true);
  

Регистрация включаемого файла (внешний js):

 if (!Page.ClientScript.IsClientScriptIncludeRegistered("getNumberScript"))
    Page.ClientScript.RegisterClientScriptInclude("getNumberScript", "getNumberScript.js");