2012-06-11 92 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”如果有例外)。在这里,我分割字符串并使用它的值在文本框中设置文本。