Пользовательский элемент управления Asp.net и функция JavaScript - PullRequest
0 голосов
/ 03 октября 2011

Существует пользовательский элемент управления 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();">

UPDATE:

    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 && !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) &&
                        !string.IsNullOrWhiteSpace(txtCityCode.Text) &&
                        !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) &&
                            string.IsNullOrWhiteSpace(txtCityCode.Text) &&
                            string.IsNullOrWhiteSpace(txtMainPhoneNumber.Text) &&
                            string.IsNullOrWhiteSpace(txtMainPhoneNumber.Text));
                }
            }




            /// <summary>
            /// Validate 
            /// </summary>
            public void Validate() {
                if (EnableEmptyValues) {
                    if (!IsEmpty && 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.

Ответы [ 2 ]

0 голосов
/ 03 октября 2011

Нет необходимости присваивать динамическое имя вашей функции 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");
0 голосов
/ 03 октября 2011

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


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

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

, а затем

'txtElement'.getNumber();

, чтобы вы могли изменить свой код на

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