Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何配置asp.net webforms WebMethod日期格式_C#_Asp.net_Webforms_Date Format_Webmethod - Fatal编程技术网

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

C# 如何配置asp.net webforms WebMethod日期格式,c#,asp.net,webforms,date-format,webmethod,C#,Asp.net,Webforms,Date Format,Webmethod,我有一个webmethod,它接收一个包含日期属性的对象。 我正在将表示对象的json传递给webmethod。 asp.net自动将json字符串转换为对象,因此我的方法如下所示: [WebMethod] public static Object Save(MyObject item) { .... } public class MyObject { DateTime date; ..... } 当以美国格式发送日期时,这一切都很有效:'MM/dd/yyyy'

我有一个webmethod,它接收一个包含日期属性的对象。 我正在将表示对象的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方法,所以很明显我想要一个适用于所有这些方法的解决方案)


谢谢

尝试在web.config中将
文化
ui文化
设置为
en GB

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

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

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


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

也可能有帮助

我有一个webmethod,它接收一个包含日期属性的对象。我正在将表示对象的json传递给webmethod。asp.net自动将json字符串转换为对象

考虑到您正在接受JSON,这在IMO中不应该是区域性敏感的。在客户端将所有数据转换为(包括数字和日期/时间)不区分区域性的格式

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

可以将JSON看作是一种机器可读的序列化格式,对人类来说也很容易阅读。在客户端保留所有特定于区域性的解析将使您的生活更加简单


编辑:基本上,您需要了解JSON中的值的含义。如果它是供人类使用的文本,那么就把它当作一个字符串,不要试图解析它,而是在任何您想要显示的文化中生成它。如果它是机器消耗的日期/时间值,那么就这样对待它,并以文化中立的方式(固定格式、不变文化)生成它。尝试将该值视为人类可读和机器可读的混合体会给您带来类似的问题。

我需要按照我的说明使区域性具有动态性。它是从会话加载的(登录时从数据库加载)。我从文本框(带有日期选择器)读取日期,并且我有通用客户端代码,将日期/数字等作为文本读取。日期是根据数据库中保存的用户文化显示的,因此我希望能够为反序列化json的方法配置日期格式。这可能吗?如果这是不可能的,我想我必须按照你说的做,然后客户端必须知道用户文化是什么,以便将文本转换为日期,然后再转换回文本。我不想这样做。@Daniel:你绝对应该在客户端这样做。理想情况下,您不应该从日期选择器开始读取文本-它应该为您提供
日期
或类似的内容。然后可以以不区分区域性的方式将其转换为文本。这可能比在服务器上处理区域性敏感格式问题要小得多。是否并没有全局方法告诉webmethods要使用哪种日期格式?为什么这会很困难?我有大约20页这样做,他们确实使用全局js代码,所以这样做应该不是什么大问题,但在我看来,服务器端是做这件事的正确地方,让客户端尽可能保持沉默。区域性不依赖于浏览器,而是取决于数据库中的用户设置,因此服务器已经在处理区域性。我希望它能处理所有的文化问题。@Daniel:这对我来说毫无意义-你已经说过JSON来自客户端。。。这不是决定用什么的原因吗?您根本不应该将文本传递到数据库中。您应该传入
DateTime
值。听起来你需要明确你的问题。我不知道有什么全局方法可以告诉
WebMethods
使用什么日期格式,但是在任何地方都使用相同的格式,使用一个常量值,这样您就只有一个地方可以更改,应该不会太难。
DateTime myEurpeonDate= DateTime.ParseExact(MyObject.date, "dd/MM/yyyy", null);