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

时间:2013-01-16 12:39:27

标签: 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;
     .....
}

当日期以美国格式发送时,这一切都很有效:'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方法,所以显然我想要一个适用于所有这些方法的解决方案。)

由于

4 个答案:

答案 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中设置cultureuiCultureen-GB

<system.web>
    <globalization culture="en-GB" uiCulture="en-GB" />
<system.web>

答案 3 :(得分:0)

调用 DateTime DateTimeOffset 类型的 TryParse Parse 方法来尝试转换。也可以在其中使用 CultureInfo 对象。下面给出一个很好的例子..

也可能有帮助..