2009-08-11 81 views
0

我有幾個文本框只包含日期。如果一個文本框有一個日期,並且用戶試圖提交而不在另一個日期文本框中輸入日期,則它們將在提交之前停止。我想要做到這一點的方式是使用以下JavaScript函數:在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" 

這裏是驗證

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 

我的問題是,JavaScript是沒有找到兩個文本框,因爲我在代碼 任何想法創造呢?

回答

1

我是ClientScriptManager的對手。上述解決方案可能會起作用,但另一種方法是在ClientValidate()方法之外的JavaScript中聲明幾個變量。

var textdate1; 
var textdate2; 

把文字在你的頁面的某個地方(你真的可以把它作爲長期的任何地方,因爲它有RUNAT =「server」屬性)。

<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 2009-08-12 13:14:52

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 2009-08-12 16:02:53

+0

將解釋更改爲(希望)更清楚的內容。 – 2009-08-12 16:16:37

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