2012-06-11 5 views
0

В моем проекте есть 3 пользовательских элемента управления; BasicContact, BasicDetail и ActionTime. Они находятся на странице EditOrder.aspx.Выполнение функции кода/Sub из javascript (VB.NET)

Свойство «ReportDate» (тип даты) в BasicContact, RadioButtonList «rdl_Priority» (с целым значением из поля «prio_id») в BasicDetail и свойство «CheckDate» в ActionTime. Значение ReportDate выводится из txt_ReportDate и txt_ReportTime, а значение CheckDate выводится из txt_CheckDate и txt_CheckTime.

Моя цель - рассчитать Checkdate после добавления даты в ReportDate и нажать на radioobuttonlist. Checkdate будет вычисляться из ReportDate (date) + SLAHour (час, получить от метода GetSLAHour, где вход prio_id), а затем установить текст в txt_CheckDate и txt_CheckTime.

Прямо сейчас, я смог выполнить эту задачу, используя Postback. Я создаю собственное событие и подниму его в методе RadioButtonList selectedIndexchanged. После этого событие обрабатывается в коде позади страницы EditOrder. Вот мой код. не

BasicDetail - RadioButtonList

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

BasicDetail - CodeBehind

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 - CodeBehind

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 

Однако, я не хочу страницу, которая будет обновляться (не постбэк) , Я не знаю, как вызвать функцию или sub из javascript. Я попробовал PageMethod, но это вызвало ошибку во время выполнения, заявив, что метод не поддерживается. Во всяком случае, если есть лучший способ, чем вызов кода из javascript, пожалуйста, дайте мне знать.

Заранее спасибо

+0

Ah Ну, я решил проблему теперь с помощью UpdatePanel. Но я не уверен, влияет ли это на другие функции программы. –

+0

Наконец, я смог решить проблему, используя PageMethod, который лучше, чем UpdatePanel. Возможно, я неправильно использовал его в начале, чтобы он вызывал ошибку (до этого я поместил ее в пользовательский элемент управления, а теперь переместил ее на страницу EditOrder). –

+0

Вы должны * подробно * ваше решение в качестве ответа на свой вопрос. В дополнение к небольшому количеству репутации, это делает весь этот пост более полезным для следующего парня, который смотрит на что-то подобное. – CJM

ответ

0

Ok К сожалению, вот мое решение

Поскольку сейчас я PageMethod, чтобы решить эту проблему, мне не нужно поднимать функцию события из кода позади больше, так что я удалил все коды, которые я опубликовал, чтобы задать свой вопрос.

Во-первых, я добавил функцию яваскрипта к каждому элементу в RadioButtonList в BasicDetail коде позади

BasicDetail - код за

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

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 

Результат возвращается к функции "OnGetCheckDateComplete" в JavaScript (или "OnGetCheckDateError" если есть исключение). Здесь я разбил String и использовал его значение для установки текста в текстовом поле.

Смежные вопросы