Sulla Programmazione

Quattro chiacchere sulla programmazione e sulle bit-tecnologie con Fabrizio Cipriani

Passaggio di un parametro DateTime ad un WebMethod (ASMX) con jQuery ajax

Non esiste molta documentazione su come scambiare valori DateTime tra javascript e un servizio .net (asmx). Un grande lavoro l'ha fatto Adam Schroder nel suo post sull'argomento

Un servizio ASP.NET decorato con il tag ScriptService accetta un datetime nel formato:

"\/Date(x)\/"

dove x è il valore ritornato dal metodo getTime() dell'oggetto javascript Date. Un parametro DateTime ha quindi più o meno questo aspetto quando viene passato nel parametro "data" di una chiamata al metodo ajax di jQuery:

'{ dateparam: "\\\/Date(' + (new Date()).getTime() + ')\\\/" }'

(Prefissiamo con il carattere di escape "\" anche la barra normale "/").

Il web service .NET userà lo stesso formato nel caso debba ritornare lo stesso tipo di dato, ovvero un DateTime. Se lo voglio convertire in un oggetto Date di javascript, posso usare una regular expression:

var newdate;
a = /^\/Date\((-?[0-9]+)\)\/$/.exec(response.d);
if (a) {
  newdate = new Date(parseInt(a[1], 10));
}

Ecco un esempio completo che passa un valore DateTime ad un servizio ASP.NET, il quale lo ritorna aumentato di 5 giorni. L'esempio usa jQuery:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<body>
<script type="text/javascript">       
    $(document).ready( function() {
    $.ajax({
        type: "POST"
        , url: "/Services/Service.asmx/Test_DateTime"
        , data: '{ datein: "\\\/Date(' + (new Date()).getTime() + ')\\\/" }'
        , contentType: "application/json; charset=utf-8"
        , dataType: "json"
        , success: function(response) {
            var newdate;
            a = /^\/Date\((-?[0-9]+)\)\/$/.exec(response.d);
            if (a) {
            newdate = new Date(parseInt(a[1], 10));
            }
            alert(newdate);
        }
        , error: function(xhr) {
            alert(xhr.responseText);
        }
        })
    });
 </script> 
<input type="button" value="start test" onclick="doTest()" />
</body>

e questo è il webmethod da mettere nel web service:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class MyService : System.Web.Services.WebService
{
    [WebMethod]
    public DateTime Test_DateTime(DateTime datein)
    {
        return datein.Add(new TimeSpan(5, 0, 0, 0));
    }
}

Comments