Как передать значение DateTime в WebMethod (ASMX) - PullRequest
11 голосов
/ 07 января 2011

У меня есть WebMethod с параметром, определенным как DateTime. Когда я называю это

webservice, я получаю эту ошибку:

в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject () в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal (Int32 глубина) в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary (Int32 глубина) в System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal (Int32 глубина) в System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize (String ввод, Int32 deepLimit, Сериализатор JavaScriptSerializer) в System.Web.Script.Serialization.JavaScriptSerializer.Deserialize (JavaScriptSerializer сериализатор, строковый ввод, тип типа, Int32 deepLimit) в System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [Т] (Строка вход) в System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (HttpContext контекст, JavaScriptSerializer сериализатор) в System.Web.Script.Services.RestHandler.GetRawParams (WebServiceMethodData methodData, контекст HttpContext) в System.Web.Script.Services.RestHandler.ExecuteWebServiceCall (HttpContext контекст, WebServiceMethodData methodData) "

Это мой веб-сервис:

/// <summary>
/// Summary description for AgendamentoService
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class AgendamentoService : System.Web.Services.WebService
{

    public AgendamentoService()
    {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    public CompromissoWekCalendarVO[] GetCompromissos(int id_pessoa, DateTime start, DateTime end)
    {
        bo.CompromissoBO compBO = new bo.CompromissoBO();
        return compBO.Get(id_pessoa,start, end).ToArray();
    }

}

И вот мой код на стороне клиента:

 var params =  '{id_pessoa: "' + id_pessoa + '", start:/Date('+ start.getTime()+')/, end:/Date(' + end.getTime()+')/}';
                    $.ajax(  
                         {  
                             type: "POST",  
                             dataType: "json",
                             contentType: "application/json; charset=utf-8",  
                             url: '<%= this.ResolveClientUrl("~/services/misc/AgendamentoService.asmx/GetCompromissos") %>',  
                             data: params,  
                             success: function (json) {  

                                if ($.isArray(json.d)) {
                                  $.each(json.d, function(key, value) {
                                    value.start = getJsonDate(value.start);
                                    value.end = getJsonDate(value.end);
                                  });
                                }

                                callback(json.d);                                 

                             }  
                         });

Где время начала и окончания - это два javascript-объекта Date.

Ответы [ 2 ]

9 голосов
/ 07 января 2011

Это связано с тем, что в ASP.NET Ajax существует определенный формат даты / времени, форма которого равна "\/Date(x)\/", где x - это количество мс, прошедшее с 1 января 1970 года в полночь по UTC. По сути, вам нужно использовать некоторую вспомогательную функцию, которая будет преобразовывать ваши даты JS в нужный формат при вызове службы (и наоборот, дата / время json из службы в объект даты / времени JS).

Итак, вы должны изменить фрагмент кода, например

`'", start:/Date('+ start.getTime()+')/, end...` 

до

'", start:"\\\/Date(' + this.getTime() + ')\\\/", end...'

Самый быстрый способ использования нижеследующего плагина:

http://schotime.net/blog/index.php/2008/07/01/jquery-plugin-for-aspnet-ajax-jmsajax/

Вы можете найти больше информации в следующих статьях:

http://www.overset.com/2008/07/18/simple-jquery-json-aspnet-webservice-datetime-support/

http://schotime.net/blog/index.php/2008/06/19/jquery-ajax-aspnet-and-dates/

http://msmvps.com/blogs/luisabreu/archive/2009/08/19/jquery-full-control-with-the-ajax-function.aspx

1 голос
/ 04 июня 2014

Это сработало для меня:

JSON.stringify(new Date())

Это преобразует его в формат, подобный «2014-06-04T14: 26: 27.129Z», который мой веб-сервис с радостью принимает для параметра DateTime.

...