2011-01-07 2 views
11

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

вебсервис, я получаю эту ошибку:

at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject() at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth) at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer) at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input) at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer) at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context) at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)"

Это моя WebService:

/// <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);         

          } 
         }); 

Где «start» и «end» time - два объекта «Дата» javascript.

ответ

9

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

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

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

в

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

Quickest способ использования ниже плагин:

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

+0

VinayC, спасибо вам! Я не знал о jMsAjax. – Cleiton

+0

Плагин jMsAjax, похоже, не работает с последней версией jQuery (1.6.2). – Gan

+0

@Gan, вы можете сообщить о своей проблеме/ошибке автору в качестве комментария к его записи в блоге (ссылка в ответе). – VinayC

1

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

JSON.stringify(new Date()) 

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

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