【问题标题】:How to configure asp.net webforms WebMethod Date format如何配置asp.net webforms WebMethod 日期格式
【发布时间】:2013-01-16 12:39:26
【问题描述】:

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

但这似乎对我收到错误的网络方法预期的日期格式没有影响:

"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 方法,所以很明显我想要一个适用于所有这些的解决方案)。

谢谢

【问题讨论】:

    标签: c# asp.net webforms date-format webmethod


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我从文本框中读取日期(带有日期选择器),并且我有通用客户端代码,可以将日期/数字等读取为文本。日期根据保存在数据库中的用户文化显示,因此我希望能够为反序列化 json 的方法配置日期格式。这可能吗?如果不可能,我想我将不得不按照你说的做,然后客户端必须知道用户文化是什么,以便将文本传输到日期并再次返回文本。我宁愿不这样做。
    • @Daniel:你绝对应该在客户端做。理想情况下,您不应该从日期选择器开始阅读文本 - 它应该为您提供 Date 或类似的东西。然后,您可以以不区分文化的方式将其转换为文本。与尝试处理服务器上的文化敏感格式相比,这可能问题少。
    • 没有全局方式告诉 webmethods 使用什么日期格式吗?为什么这会很困难?我有大约 20 个页面在执行此操作,它们确实使用全局 js 代码,因此执行此操作应该不是什么大问题,但在我看来,服务器端是执行此操作的正确位置,让客户端尽可能保持愚蠢.
    • 附注文化不依赖于浏览器,它取决于数据库中的用户设置,因此服务器已经处理了文化。我想让它处理所有的文化问题。
    • @Daniel:这对我来说毫无意义 - 你已经谈到来自客户端的 JSON ......这不是决定使用什么的原因吗?您根本不应该将 text 传递到数据库中。您应该传入 DateTime 值。听起来你需要明确澄清你的问题。我不知道有任何全局方式告诉WebMethods 使用什么日期格式,但是在任何地方简单地使用相同的日期格式应该不会太难,使用一个常量值,所以你只有一个地方可以改变.
    【解决方案2】:

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

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

    即:

    DateTime myEurpeonDate= DateTime.ParseExact(MyObject.date, "dd/MM/yyyy", null);
    

    【讨论】:

      【解决方案3】:

      尝试在 web.config 中将 cultureuiCulture 设置为 en-GB

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

      【讨论】:

      • 我需要像我指定的那样动态地培养文化。它是从会话加载的(登录时从数据库加载)。
      【解决方案4】:

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

      也可能有帮助..

      【讨论】:

        猜你喜欢
        • 2010-09-22
        • 1970-01-01
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 2012-12-12
        • 1970-01-01
        • 2019-12-31
        相关资源
        最近更新 更多