2

我有一个接收包含日期属性的对象的网络方法。我将代表对象的 json 传递给 webmethod。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 被读入会话。

但这似乎对我收到错误的 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"}

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

谢谢

4

4 回答 4

10

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

鉴于您接受 JSON,这不应该文化敏感的 IMO。在客户端将所有数据(包括数字和日期/时间)转换为不区分文化的格式。

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

将 JSON 视为一种机器可读的序列化格式,它恰好也很容易被人类阅读。将所有特定于文化的解析保留在客户端将使您的生活变得更加简单。

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

于 2013-01-20T13:55:59.243 回答
2

您可以将参数类型更改为字符串,然后您可以将该字符串转换为您想要的任何类型

public void Save(MyObject itemdate){
    *Code*
}
public class MyObject 
{
     string date;
     .....
}

IE:

DateTime myEurpeonDate= DateTime.ParseExact(MyObject.date, "dd/MM/yyyy", null);
于 2013-01-20T10:50:34.007 回答
1

尝试在 web.config 中设置culture和:uiCultureen-GB

<system.web>
    <globalization culture="en-GB" uiCulture="en-GB" />
<system.web>
于 2013-01-20T09:42:51.463 回答
0

调用DateTimeDateTimeOffset类型的TryParseParse方法来尝试转换。还要在其中使用CultureInfo对象。下面给出了一个很好的例子..

也可能有帮助..

于 2013-01-20T11:05:04.153 回答