2010-04-05 5 views

Répondre

2

Vous ne pouvez pas appeler directement appel de fonction. car Javascript est un langage de script destiné aux navigateurs Web.

Vous pouvez utiliser AJAX ou la publication d'une page entière en envoyant les paramètres pour vous permettre d'exécuter la sous-routine. En savoir plus sur Ajax c'est la meilleure façon de faire.

1

Pour développer ce que Kronass a dit ici, j'ai trouvé cet article pour être utile dans le passé pour faire ce que vous voulez http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/. Encosia a aussi un tas d'autres parcelles de blog sur ce si vous faites un peu de recherche

Qu'est-ce que vous cherchez à utiliser est normalement appelé WebMethod, ScriptMethod ou page Méthode selon le cadre que vous utilisez

1

Pour ce faire, vous pouvez utiliser l'interface ICallbackEventHandler. J'ai vu que vous aviez une question concernant l'AjaxControToolkit CalendarExtender l'autre jour, donc je suppose que cette question est liée à cela et comment vous faites une validation dans une méthode côté serveur. ICallbackEventHandler est AJAX, mais vous pouvez écrire votre validation en tant que méthode normale et non en tant que PageMethod/WebMethod. C'est un peu plus compliqué du côté Javascript, mais pas de beaucoup.

Commençons par notre base et le calendrier textbox d'extension:

<form id="form1" runat="server"> 
<asp:ScriptManager runat="server" ID="ScriptManager" /> 
<div> 
<asp:TextBox runat="server" ID="DateTextBox" /> 
<ajaxtoolkit:CalendarExtender runat="server" ID="CalendarExtender" TargetControlID="DateTextBox" 
PopupButtonID="SelectorButton" OnClientDateSelectionChanged="checkDate" Format="dd MMM yyyy" /> 
<asp:ImageButton runat="server" ID="SelectorButton" ImageUrl="Path to a pretty graphic" /> 
<br /> 
<asp:Label runat="server" ID="ValidDateLabel" /> 
</div> 
</form> 

J'ai ajouté l'attribut OnDateSelectionChanged de l'extension car cela donnera le coup d'envoi du processus d'appel de la méthode côté serveur; nous reviendrons à ce qui s'y passe bientôt.

Dans la déclaration de classe dans votre code-behind, vous devez dire que vous implémentez l'interface:

Partial Public Class _Default 
    Inherits System.Web.UI.Page 
    Implements ICallbackEventHandler 

Pour implémenter l'interface nous avons besoin alors d'ajouter deux autres méthodes pour gérer les deux méthodes l'interface, RaiseCallbackEvent et GetCallbackResult. Nous avons également besoin d'une propriété pour un peu de stockage temporaire de la date que nous essayons de valider.

Private mCallbackDate As Date 

Private Property CallbackDate() As Date 
    Get 
     Return mCallbackDate 
    End Get 
    Set(ByVal value As Date) 
     mCallbackDate = value 
    End Set 
End Property 

Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements ICallbackEventHandler.RaiseCallbackEvent 
    'eventArgument will contain the date the user selected from the extender 

    Dim testDate As Date 

    If eventArgument = String.Empty Then 
    Else 
     If Date.TryParse(eventArgument, testDate) Then 
      'If we have a legal date selected then store it 
      Me.CallbackDate = testDate 
     End If 
    End If 

End Sub 

Public Function GetCallbackResult() As String Implements ICallbackEventHandler.GetCallbackResult 

    Dim result As String = String.Empty 

    'Get the date that we stored in memory and pass it to our CheckDate function 
    'We'll pass back to the Javascript in the page the string 'true' if the date is 
    'valid under our business rules and 'false' if it isn't 
    If checkDate(Me.CallbackDate) Then 
     Return "true" 
    Else 
     Return "false" 
    End If 

End Function 

Public Function checkDate(ByVal dateToCheck As Date) As Boolean 

    'If the date is in the future then return True, otherwise False 
    If dateToCheck > Date.Today Then 
     Return True 
    Else 
     Return False 
    End If 

End Function 

Il y a un bit de côté serveur, nous devons ajouter, dans Page_Load, qui fait l'accrochage en place du code côté serveur Javascript et. La fonction GetCallbackEventReference de ClientScriptManager injecte un peu de script dans notre page qui prend en charge la communication entre le navigateur et le serveur. Ensuite, nous avons juste besoin d'enregistrer un bloc de script qui appelle le script injecté - nous appellerons cette fonction checkDateOnServer.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    Dim callbackScript As String 

    callbackScript = "function checkDateOnServer(arg){" & _ 
     Page.ClientScript.GetCallbackEventReference(Me, "arg", "receiveDateValidation", "") & _ 
     "}" 

    ClientScript.RegisterClientScriptBlock(Me.GetType, "callback", callbackScript, True) 

End Sub 

Retour aux bits côté client. Nous devons écrire une fonction Javascript checkDate qui passera la date sélectionnée par l'utilisateur dans le rappel.

function checkDate() 
    { 
     // Get the date the user selected 
     var selectedDate = document.getElementById('DateTextBox').value; 

     // This will start the callback sequence 
     checkDateOnServer(selectedDate); 
    } 

Le dernier bit que nous devons faire est de recevoir la valeur revenant du serveur, que nous avons dit dans Page_Load serait appelé receiveDateValidation.

function receiveDateValidation(arg, context) 
    { 
     var ValidDateLabel = document.getElementById('SelectedDateLabel'); 

     // We get a string value back from the server which is 'true' or 'false'   
     if (arg == 'true') 
     { 
      ValidDateLabel.innerText = 'Your date IS valid'; 
     } 
     else 
     { 
      ValidDateLabel.innerText = 'Your date IS NOT valid'; 
     } 
    } 
Questions connexes