Как передать значение DateTime в WebMethod (ASMX)
У меня есть 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 depthLimit, JavaScriptSerializer serializer) в System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Тип типа, Int32 depthLimit) при 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) "
Это мой 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);
}
});
Где "начало" и "конец" - два объекта "Дата" javascript.
Ответы
Ответ 1
Это потому, что существует определенный формат даты/времени, который ожидает 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
Ответ 2
Это сработало для меня:
JSON.stringify(new Date())
Это преобразует его в формат "2014-06-04T14: 26: 27.129Z", который мой веб-сервис рад принять за параметр DateTime.