2012-06-11 29 views
0

在我的項目中,有3個用戶控件; BasicContact,BasicDetail和ActionTime。它們位於EditOrder.aspx頁面中。從javascript(VB.NET)執行代碼隱藏函數/子程序

有一個在BasicContact 「ReportDate」 屬性(日期型),單選按鈕列表 「rdl_Priority」(與來自 「prio_id」 字段的整數值)的BasicDetail和ActionTime 「了checkdate」 屬性。 ReportDate值來源於txt_ReportDate,txt_ReportTime和CheckDate值來源於txt_CheckDate和txt_CheckTime。

我的目標是在將日期添加到ReportDate並單擊radiobuttonlist後計算Checkdate。 Checkdate將根據ReportDate(日期)+ SLAHour(小時,從輸入爲prio_id的「GetSLAHour」方法獲得)計算,然後在txt_CheckDate和txt_CheckTime中設置文本。

現在,我可以使用Postback完成此任務。我創建自定義事件並在RadioButtonList selectedIndexchanged方法中引發它。之後,在EditOrder頁面後面的代碼中處理事件。這是我的代碼。

BasicDetail - 單選按鈕列表

<asp:RadioButtonList ID="rdl_Priority" runat="server" RepeatDirection="Horizontal" AutoPostBack="true" /> 

BasicDetail - 代碼隱藏

Public Event priorityClicked As System.EventHandler 

Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 
    If Not IsPostBack Then SetupList() 
End Sub 

Private Sub SetupList() 
    Dim ctx As New StsDataContext 
    With rdl_Priority 
     Dim Result = (From r In ctx.Priorities Order By r.display_order) 
     If Result.Count > 0 Then 
      .DataTextField = "prio_name" 
      .DataValueField = "prio_id" 
      .DataSource = Result 
      .DataBind() 
     Else 
      lbl_Priority.Visible = False 
      rdl_Priority.Visible = False 
     End If 
    End With 
End Sub 

Protected Sub rdl_Priority_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rdl_Priority.SelectedIndexChanged 
    RaiseEvent priorityClicked(sender, e) 
End Sub 

EditOrder - 代碼隱藏

Private Sub BasicDetail_priorityClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles BasicDetail.priorityClicked 
    Dim reportDate As Date? = BasicContact.ReportDate 
    Dim SLAHour As Integer? = GetSLAHour(BasicDetail.PriorityId) 
    If reportDate.HasValue AndAlso SLAHour.HasValue Then 
     ActionTime.CheckDate = CDate(reportDate).AddHours(CDbl(SLAHour)) 
    End If 
End Sub 

不過,我不希望頁面被刷新(無回傳) 。我不知道如何從JavaScript調用函數或子。我已經嘗試過PageMethod,但是它在運行時會導致錯誤,說該方法不受支持。無論如何,如果有比從javascript調用代碼隱藏更好的方法,請讓我知道。

在此先感謝

+0

啊好吧,我現在使用UpdatePanel解決了這個問題。但我不確定這是否會影響程序中的其他功能。 –

+0

最後,我可以使用比UpdatePanel更好的PageMethod來解決問題。也許我在開始時誤用了它,導致錯誤(之前我把它放在用戶控件中,現在我把它移到了EditOrder頁面)。 –

+0

你應該詳細說明你的解決方案,作爲你自己問題的答案。除了少量的代表之外,它使得整個帖子對於下一個看到類似內容的人更有用。 – CJM

回答

0

好對不起,這裏是我的解決方案

因爲現在我用PageMethod的解決這個問題,我不需要從代碼籌集事件背後的功能了,所以我刪除了所有我張貼的代碼問我自己的問題。後面的代碼

Private Sub rdl_Priority_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles rdl_Priority.DataBound 
    For Each li As ListItem In rdl_Priority.Items 
     Dim slaHour As Integer? = GetSLAHour(li.Value) 
     li.Attributes.Add("onclick", "return CalCheckDate(" & If(slaHour.HasValue, CStr(slaHour), "null") & ");") 
    Next 
End Sub 

這種「CalCheckDate」功能添加到每個按鈕EditOrder頁面中實現(用戶 -

首先,我在單選按鈕列表中BasicDetail代碼

BasicDetail添加JavaScript函數的每個項目背後

控制的父頁)

EditOrder.aspx

<script type="text/javascript"> 
    function CalCheckDate(hour) { 
     var hid_ServId = document.getElementById('<%=hid_ServId.ClientID%>'); 
     var txt_reportDate = document.getElementById('<%=BasicContact.ReportDateTextName%>'); 
     var txt_reportTime = document.getElementById('<%=BasicContact.ReportTimeTextName%>'); 
     PageMethods.GetCheckDateTime(hid_ServId.value, txt_reportDate.value, txt_reportTime.value, hour, OnGetCheckDateComplete, OnGetCheckDateError); 
    } 
    function OnGetCheckDateComplete(result) { 
     var txt_checkDate = document.getElementById('<%=ActionTime.CheckDateTextName%>'); 
     var txt_checkTime = document.getElementById('<%=ActionTime.CheckTimeTextName%>'); 
     var chkDateTime = result.split(" "); 
     txt_checkDate.value = chkDateTime[0]; 
     txt_checkTime.value = chkDateTime[1]; 
    } 
    function OnGetCheckDateError(e) 
    { 
     alert(e._message); 
    } 
</script> 
用戶控制,例如txt_ReportDate在BasicContact內

子控制,可以通過在BasicContact創建屬性推導如下:

BasicContact - 代碼背後

Public ReadOnly Property ReportDateTextName() As String 
    Get 
     Return txt_ReportDate.ClientID 
    End Get 
End Property 

此屬性在「CalCheckDate」功能用於獲取其值並將其傳遞給PageMethod函數。其他控件可以用相同的方式派生。

最後一步是編碼PageMethods功能, 「GetCheckDateTime」,在後面

EditOrder EditOrder碼 - 代碼隱藏

<System.Web.Services.WebMethod()> _ 
Public Shared Function GetCheckDateTime(ByVal servId As String, ByVal ReportDate As String, ByVal ReportTime As String, ByVal hour As String) As String 
    Dim checkDate As String, checkTime As String 
    '************************************************************************ 
    'Calculate check and time date from input ReportDate, ReportTime and hour 
    '************************************************************************ 
    Return checkDate & " " & checkTime 
End Function 

結果返回到JavaScript的 「OnGetCheckDateComplete」 功能(或 「OnGetCheckDateError」如果有例外)。在這裏,我分割字符串並使用它的值在文本框中設置文本。