有没有办法从asp .net web方法而不是JSON格式返回ISO格式的DateTime?

Mut*_*thu 5 .net c# asp.net json webmethod

目前web方法或经典asp .net中的大多数方法使用system.web.script.serialization.javascriptserializer类进行序列化,这将返回javascript对象的datetime成员,其值如

"/日期(滴答数)/"

.我知道这是一个臭名昭着的问题,大多数人建议在我们收到数据后使用某种转换器或将数据作为字符串而不是对象返回.

例如班级

public class Person
{
    public String Name { get; set; }
    public int Age { get; set; }
    public DateTime DOB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果通过带有[ScriptMethod(ResponseFormat = ResponseFormat.Json)]修饰的System.Web.Services.WebMethod返回,则响应将在result.d中返回如下.

{Name:"Steve", Age:30, DOB:"/Date(1249335477787)/"};
Run Code Online (Sandbox Code Playgroud)

我们需要应用一些代码将DOB转换为ISO格式或其他一些可接受的格式.

但我只是想看看是否有人做了某种响应调整或使用过度的类来从web方法返回DateTime值.有没有办法覆盖javascriptserializer的功能,并在asp .net web方法中使用它,以便它直接以ISO格式返回日期?我知道它可以通过几种方式在asp .net MVC中完成.

是否可以在asp .net web表单的Web方法中完成相同的操作?这样可以节省大量代码和错误:)

Bab*_*loo -3

您可以轻松地在 webmethod 中声明响应类型。您还可以使用此链接中所述的自定义序列化程序,或查看以下有关如何格式化日期的代码:

class DualDateJsonConverter : JsonConverter
{

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {

        JObject result = new JObject();

        DualDate dd = (DualDate)value;

        result.Add("DateOne", JToken.FromObject(dd.DateOne.ToString("MM.dd.yyyy")));
        result.Add("DateTwo", JToken.FromObject(dd.DateTwo));
        result.WriteTo(writer);
    }

    // Other JsonConverterMethods
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DualDate);
    }

    public override bool CanWrite
    {
        get
        {
            return true;
        }
    }
    public override bool CanRead
    {
        get
        {
            return false;
        }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
 Context.Response.ContentType = "application/json";
 Context.Response.Write(response);
Run Code Online (Sandbox Code Playgroud)