Asp.net

如何將 DateTime 值傳遞給 WebMethod (ASMX)

  • June 4, 2014

我有一個 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 參數。

引用自:https://stackoverflow.com/questions/4622172