如何將 DateTime 值傳遞給 WebMethod (ASMX)
我有一個 WebMethod,其參數定義為 DateTime。當我這樣稱呼
網路服務,我收到此錯誤:
在 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 depth) 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer 序列化器) 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化器, System.Web.Script.Serialization.JavaScriptSerializer.Deserialize 處的字元串輸入、類型類型、Int32 depthLimit)
$$ T $$(字元串輸入) 在 System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context) 在 System.Web.Script.Services 的 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer 序列化程序) .RestHandler.ExecuteWebServiceCall(HttpContext context, 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’日期’對象。
那是因為 ASP.NET Ajax 需要特定的日期/時間線格式 - 它的形式為
"\/Date(x)\/",其中 x 是自 1970 年 1 月 1 日午夜 UTC 以來經過的毫秒數。所以本質上,您需要使用一些輔助函式,在呼叫服務時將您的 JS 日期轉換為所需的格式(反之亦然,從服務到 JS 日期/時間對象的日期/時間 json)。因此,您必須更改程式碼片段,例如
`'", 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
這對我有用:
JSON.stringify(new Date())這會將其轉換為像“2014-06-04T14:26:27.129Z”這樣的格式,我的 Web 服務很樂意接受它作為 DateTime 參數。