如何配置asp.net webforms WebMethod日期格式

Dan*_*iel 2 c# asp.net webforms date-format webmethod

我有一个webmethod接收包含日期属性的对象.我传递了一个代表webmethod对象的json.asp.net自动将json字符串转换为对象,因此我的方法如下所示:

[WebMethod]
public static Object Save(MyObject item)
{
   ....
}

public class MyObject 
{
     DateTime date;
     .....
}
Run Code Online (Sandbox Code Playgroud)

当以美国格式发送日期时,这一切都很有效:'MM/dd/yyyy' 当日期以欧洲格式发送时:'dd/MM/yyy'我收到错误.

我在全局asax中设置线程的文化:

void Application_AcquireRequestState(object sender, EventArgs e)
{
     var s = GetSessionValues();
     System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(s.CultureID);
     System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(s.CultureID);
}
Run Code Online (Sandbox Code Playgroud)

此代码正确运行,它从会话中读取文化ID并设置它.从数据库登录时,将文化ID读入会话.

但这似乎对我收到错误的Web方法所期望的日期格式没有影响:

"31/08/2012 is not a valid value for DateTime.",
"StackTrace":"  
at System.ComponentModel.DateTimeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(Object propertyValue, Object o, String memberName, JavaScriptSerializer serializer, Boolean throwOnError)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n  
at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer)\r\n  
at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary`2 rawParams)\r\n  
at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)\r\n  
at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n  
at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.FormatException"}
Run Code Online (Sandbox Code Playgroud)

如何设置web方法的预期日期格式(我有很多这些Web方法,所以显然我想要一个适用于所有这些方法的解决方案).

谢谢

Jon*_*eet 10

我有一个webmethod接收包含日期属性的对象.我传递了一个代表webmethod对象的json.asp.net自动将json字符串转换为对象

既然你要接受JSON,这应该不会是文化敏感IMO.将所有数据转换为(包括数字和日期/时间)在客户端的文化不敏感格式.

因此,如果您在UI中接受日期输入,请将JavaScript转换为本地日期/时间对象,然后将其转换为您要使用的任何特定格式.(就个人而言,我建议使用yyyy-MM-ddTHH:mm:ss.fffZ一种非常明确的格式,但我们会去.)

JSON看作该机器可读的序列化格式恰好是易于人类阅读过.在客户端保留所有特定于文化的解析将使您的生活更加简单.

编辑:从根本上说,你需要弄清楚你在JSON中的价值意味着什么.如果它是供人类消费的文本,则将其视为字符串,不要尝试解析它,并以您想要显示的任何文化生成它.如果它是机器消耗的日期/时间值,那么就这样对待并以文化中立的方式(固定格式,不变文化)进行生产.试图把该值作为人类可读和机器可读的混合物将会给你这样的问题.