我有一个webmethod接收包含日期属性的对象。 我传递了一个代表webmethod对象的json。 asp.net自动将json字符串转换为对象,因此我的方法如下:
[WebMethod]
public static Object Save(MyObject item)
{
....
}
public class MyObject
{
DateTime date;
.....
}
当日期以美国格式发送时,这一切都很有效:'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);
}
此代码正确运行,它从会话中读取文化ID并进行设置。 从数据库登录时,将文化ID读入会话。
但这似乎对我收到错误的网络方法所期望的日期格式没有影响:
"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"}
如何设置webmethod的预期日期格式(我有很多这些Web方法,所以显然我想要一个适用于所有这些方法的解决方案。)
由于
答案 0 :(得分:10)
我有一个webmethod接收包含日期属性的对象。我传递了一个代表webmethod对象的json。 asp.net自动将json字符串转换为对象
鉴于你正在接受JSON,这应该不是文化敏感的IMO。将所有数据转换为(包括数字和日期/时间)在客户端的文化不敏感格式。
因此,如果您在UI中接受日期输入,请将JavaScript转换为本地日期/时间对象,然后将其转换为您要使用的任何特定格式。 (我个人建议使用yyyy-MM-ddTHH:mm:ss.fffZ
作为一种非常明确的格式,但我们去了。)
将JSON视为机器可读的序列化格式,发生也易于为人类阅读。在客户端保留所有特定于文化的解析将使您的生活更加简单。
编辑:从根本上说,你需要弄清楚你在JSON中的价值意味着什么。如果它是供人类消费的文本,则将其视为字符串,不要尝试解析它,并以您想要显示的任何文化生成它。如果它是机器消费的日期/时间值,那么就这样对待并以文化中立的方式(固定格式,不变文化)进行生产。试图将该值视为人类可读和机器可读的混合将给您带来这样的问题。
答案 1 :(得分:2)
您可以将参数类型更改为字符串,然后您可以将该字符串转换为您想要的任何类型
public void Save(MyObject itemdate){
*Code*
}
public class MyObject
{
string date;
.....
}
即:
DateTime myEurpeonDate= DateTime.ParseExact(MyObject.date, "dd/MM/yyyy", null);
答案 2 :(得分:1)
尝试在web.config中设置culture
和uiCulture
到en-GB
:
<system.web>
<globalization culture="en-GB" uiCulture="en-GB" />
<system.web>
答案 3 :(得分:0)
调用 DateTime 或 DateTimeOffset 类型的 TryParse 或 Parse 方法来尝试转换。也可以在其中使用 CultureInfo 对象。下面给出一个很好的例子..
也可能有帮助..