2009-08-11 4 views
0

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

function ClientValidate(sender, args) { 
     // Get Both form fields 
     var txtdate1 = document.getElementById('<%=txtdate1.ClientID%>'); 
     var txtdate2 = document.getElementById('<%=txtdate2.ClientID %>'); 

    // do you client side check to make sure they have something 
     if (txtdate1.value != '' && txtdate2.value == '') { 

     args.IsValid = false; 
    } 
    else 
    { 
     args.IsValid = true; 
    } 
    if (txtdate2.value != '' && txtdate1.value == '') { 

     args.IsValid = false; 

    } 
    else { 
     args.IsValid = true; 
    } 
} 

Создание текстовых полей даты и материал следующим образом.

Dim bttndate1 As New ImageButton 
    bttndate1.ID = "bttndate1" 

    Dim txtdate1 As New TextBox 
    txtdate1.ID = "txtdate1" 
    txtdate1.Width = 65 

    Dim calex1 As New AjaxControlToolkit.CalendarExtender 
    calex1.TargetControlID = "txtdate1" 
    calex1.Format = "MM/dd/yyyy" 
    calex1.PopupButtonID = "bttndate1" 

    '**************** date box2 *************** 

    Dim bttndate2 As New ImageButton 
    bttndate2.ID = "bttndate2" 
    bttndate2.Style.Add("cursor", "pointer") 

    Dim txtdate2 As New TextBox 
    txtdate2.ID = "txtdate2" 
    txtdate2.Width = 65 


    Dim calex2 As New AjaxControlToolkit.CalendarExtender 
    calex2.TargetControlID = "txtdate2" 
    calex2.Format = "MM/dd/yyyy" 
    calex2.PopupButtonID = "bttndate2" 

Вот Validator

Dim custval As New CustomValidator 
    custval.ID = "ValidPage" 
    custval.ClientValidationFunction = "ClientValidate" 
    custval.ErrorMessage = "You Must Enter a 'From' Date and a 'To' Date" 
    custval.ErrorMessage = "You Must Select a Vendor" 
    custval.SetFocusOnError = True 
    custval.ControlToValidate = "txtdate1" 
    custval.EnableClientScript = True 

Моя проблема заключается в том, что браузер не найти двух текстовых полей, потому что я их создания в коде какие-либо идеи?

ответ

1

Я противник ClientScriptManager. Вышеупомянутые решения, вероятно, будут работать, но альтернативным методом было бы объявить пару переменных в JavaScript за пределами вашего метода ClientValidate().

var textdate1; 
var textdate2; 

Поместит буквальный на странице где-то (вы действительно можете поместить его в любом месте до тех пор, как он имеет RUNAT = атрибут «сервер»).

<asp:Literal ID="litJSVars" runat="server" /> 

Тогда в случае, когда вы создаете текстовые поля и прочее, добавьте следующий код:

this.litJSVars.Text = "textdate1 = document.getElementById('" + txtdate1.ClientID + "');\\n"; 
this.litJSVars.Text += "textdate2 = document.getElementById('" + txtdate2.ClientID + "');"; 

не лучше или хуже, чем выше идеи, это просто другой способ об этом.

0

Попробуйте это в коде валидатора ...

custval.ControlToValidate = txtdate1.ClientID 
+0

моя ошибка все тот же. Имя 'txtdate1' не объявляется. – Eric

1

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

Проблема в том, что вы пытаетесь добавить ссылку на элемент управления, который не существует до тех пор, пока сайт не запустится. Другими словами, вы пытаетесь создать текстовые поля javascript для сопоставления даты до появления текстовых полей даты (они не существуют до тех пор, пока страница не будет создана). Таким образом, линии:

`var txtdate1 = document.getElementById('<%=txtdate1.ClientID%>');  
`var txtdate2 = document.getElementById('<%=txtdate2.ClientID %>'); 

не работает, как вы ожидаете (они могут даже не компилироваться).

Я хотел бы добавить эти две строки в методе создания дата текстовых полей, так что у вас есть ссылки на JScript:

Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "var txtdate1 = document.getElementById('" + txtdate1.ClientID + "');", true); 
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "var txtdate2 = document.getElementById('" + txtdate2.ClientID + "');", true); 

Это создаст два JavaScript переменные, txtdate1 и txtdate2, которые могут быть использованы для ссылки на элементы даты.

Разница заключается в том, что скрипт для поиска элементов управления генерируется в коде позади, в то время как элементы управления создаются.

+0

Можете ли вы дать мне более подробную информацию? Я не уверен, что полностью понимаю, но это кажется законным. – Eric

+0

Изменено объяснение тому, что (надеюсь) яснее. –

0

Используйте менеджер ClientScript для регистрации вашего javascript одновременно с созданием элементов управления календарем.

0

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

Protected txtdate1 As New TextBox 
Protected txtdate2 As New TextBox 

Protected bttndate1 As New ImageButton 
Protected bttndate2 As New ImageButton 

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs) 

    bttndate1.ID = "bttndate1" 
    Page.Form.Controls.Add(bttndate1) 

    txtdate1.ID = "txtdate1" 
    txtdate1.Width = 65 
    Page.Form.Controls.Add(txtdate1) 

    Dim calex1 As New AjaxControlToolkit.CalendarExtender 
    calex1.TargetControlID = "txtdate1" 
    calex1.Format = "MM/dd/yyyy" 
    calex1.PopupButtonID = "bttndate1" 

    '**************** date box2 *************** 

    bttndate2.ID = "bttndate2" 
    bttndate2.Style.Add("cursor", "pointer") 
    Page.Form.Controls.Add(bttndate2) 

    txtdate2.ID = "txtdate2" 
    txtdate2.Width = 65 
    Page.Form.Controls.Add(txtdate2) 

    Dim calex2 As New AjaxControlToolkit.CalendarExtender 
    calex2.TargetControlID = "txtdate2" 
    calex2.Format = "MM/dd/yyyy" 
    calex2.PopupButtonID = "bttndate2" 


    MyBase.OnLoad(e) 
End Sub 
Смежные вопросы