Передача дат между c # и javascript


0

Возможно, вы можете использовать шаблон регулярного выражения, как это. Следующий код показывает функцию ToJavaScriptDate (), которая делает это для вас:

function ToJavaScriptDate(value) 
{
var pattern = /Date(([^)]+))/;
var results = pattern.exec(value);
var dt = new Date(parseFloat(results[1]));
return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
}

Функция ToJavaScriptDate () принимает значение в / Date (ticks) / format и возвращает строку даты в формате MM / dd / yyyy. Внутри функция ToJavaScriptDate () использует регулярное выражение, которое представляет шаблон / Date (([^)] +)) /.

Метод exec () принимает значение исходной даты и тесты для соответствия в значении. Возвращаемое значение exec () - это массив. В этом случае второй элемент массива результатов (результаты [1]) содержит часть тиков даты источника. Например, если исходное значение равно / Date (836418600000) / then results [1] будет 836418600000. На основании этого значения тиков формируется объект JavaScript Date. Объект Date имеет конструктор, который принимает число миллисекунд с 1 января 1970 года. Таким образом, dt содержит действительный объект JavaScript Date. Затем функция ToJavaScriptDate () форматирует дату как MM / dd / yyyy и возвращает вызывающему.


0

Я действительно не поклонник того, как JavaScriptConverter по умолчанию обрабатывает даты. Я использую следующий класс. (Класс CustomString является грязным взломом, чтобы обойти тот факт, что команда Serialize, как ожидается, вернет IDictionary. См. Запись в блоге здесь: http://blog.calyptus.eu/seb/2011/12/custom-datetime -json-сериализация / )

public class DateTimeJsonSerializer : JavaScriptConverter
{
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (dictionary == null)
            return null;

        return new JavaScriptSerializer().ConvertToType(dictionary, type);
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        if (!(obj is DateTime)) return null;

        return new CustomString(((DateTime) obj).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"));
    }

    public override IEnumerable<Type> SupportedTypes
    {
        get { return new ReadOnlyCollection<Type>(new List<Type> { typeof(DateTime), typeof(DateTime?) }); }
    }
}

public class CustomString : Uri, IDictionary<string, object>
{
    public CustomString(string str) : base(str, UriKind.Relative)
    {}

    public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
    {
        throw new NotImplementedException();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public void Add(KeyValuePair<string, object> item)
    {
        throw new NotImplementedException();
    }

    public void Clear()
    {
        throw new NotImplementedException();
    }

    public bool Contains(KeyValuePair<string, object> item)
    {
        throw new NotImplementedException();
    }

    public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
    {
        throw new NotImplementedException();
    }

    public bool Remove(KeyValuePair<string, object> item)
    {
        throw new NotImplementedException();
    }

    public int Count { get; private set; }
    public bool IsReadOnly { get; private set; }
    public bool ContainsKey(string key)
    {
        throw new NotImplementedException();
    }

    public void Add(string key, object value)
    {
        throw new NotImplementedException();
    }

    public bool Remove(string key)
    {
        throw new NotImplementedException();
    }

    public bool TryGetValue(string key, out object value)
    {
        throw new NotImplementedException();
    }

    public object this[string key]
    {
        get { throw new NotImplementedException(); }
        set { throw new NotImplementedException(); }
    }

    public ICollection<string> Keys { get; private set; }
    public ICollection<object> Values { get; private set; }
}

Чтобы использовать это в asp.net, у меня есть следующий раздел в моем web.config (обязательно замените «AssemblyNameGoesHere» на сборку, которая содержит класс преобразователя:

  <system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="2147483644">
          <converters>
            <add name="DateTimeConverter" type="DateTimeJsonSerializer,AssemblyNameGoesHere" />
          </converters>
        </jsonSerialization>
      </webServices>
    </scripting>
  </system.web.extensions>

0 принят

Мне удалось обойти это, изменив тип данных в поле «VoucherDate» в модели C # от DateTime до String. В настоящее время я не понимаю, почему это работает. Я также думаю, что должен быть лучший способ !?

JavaScript, C #, JSON, asp.net-MVC,

javascript,c#,json,asp.net-mvc,

2

Ответов: 3


0

Возможно, вы можете использовать шаблон регулярного выражения, как это. Следующий код показывает функцию ToJavaScriptDate (), которая делает это для вас:

function ToJavaScriptDate(value) 
{
var pattern = /Date(([^)]+))/;
var results = pattern.exec(value);
var dt = new Date(parseFloat(results[1]));
return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
}

Функция ToJavaScriptDate () принимает значение в / Date (ticks) / format и возвращает строку даты в формате MM / dd / yyyy. Внутри функция ToJavaScriptDate () использует регулярное выражение, которое представляет шаблон / Date (([^)] +)) /.

Метод exec () принимает значение исходной даты и тесты для соответствия в значении. Возвращаемое значение exec () - это массив. В этом случае второй элемент массива результатов (результаты [1]) содержит часть тиков даты источника. Например, если исходное значение равно / Date (836418600000) / then results [1] будет 836418600000. На основании этого значения тиков формируется объект JavaScript Date. Объект Date имеет конструктор, который принимает число миллисекунд с 1 января 1970 года. Таким образом, dt содержит действительный объект JavaScript Date. Затем функция ToJavaScriptDate () форматирует дату как MM / dd / yyyy и возвращает вызывающему.


0

Я действительно не поклонник того, как JavaScriptConverter по умолчанию обрабатывает даты. Я использую следующий класс. (Класс CustomString является грязным взломом, чтобы обойти тот факт, что команда Serialize, как ожидается, вернет IDictionary. См. Запись в блоге здесь: http://blog.calyptus.eu/seb/2011/12/custom-datetime -json-сериализация / )

public class DateTimeJsonSerializer : JavaScriptConverter
{
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (dictionary == null)
            return null;

        return new JavaScriptSerializer().ConvertToType(dictionary, type);
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        if (!(obj is DateTime)) return null;

        return new CustomString(((DateTime) obj).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"));
    }

    public override IEnumerable<Type> SupportedTypes
    {
        get { return new ReadOnlyCollection<Type>(new List<Type> { typeof(DateTime), typeof(DateTime?) }); }
    }
}

public class CustomString : Uri, IDictionary<string, object>
{
    public CustomString(string str) : base(str, UriKind.Relative)
    {}

    public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
    {
        throw new NotImplementedException();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public void Add(KeyValuePair<string, object> item)
    {
        throw new NotImplementedException();
    }

    public void Clear()
    {
        throw new NotImplementedException();
    }

    public bool Contains(KeyValuePair<string, object> item)
    {
        throw new NotImplementedException();
    }

    public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
    {
        throw new NotImplementedException();
    }

    public bool Remove(KeyValuePair<string, object> item)
    {
        throw new NotImplementedException();
    }

    public int Count { get; private set; }
    public bool IsReadOnly { get; private set; }
    public bool ContainsKey(string key)
    {
        throw new NotImplementedException();
    }

    public void Add(string key, object value)
    {
        throw new NotImplementedException();
    }

    public bool Remove(string key)
    {
        throw new NotImplementedException();
    }

    public bool TryGetValue(string key, out object value)
    {
        throw new NotImplementedException();
    }

    public object this[string key]
    {
        get { throw new NotImplementedException(); }
        set { throw new NotImplementedException(); }
    }

    public ICollection<string> Keys { get; private set; }
    public ICollection<object> Values { get; private set; }
}

Чтобы использовать это в asp.net, у меня есть следующий раздел в моем web.config (обязательно замените «AssemblyNameGoesHere» на сборку, которая содержит класс преобразователя:

  <system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="2147483644">
          <converters>
            <add name="DateTimeConverter" type="DateTimeJsonSerializer,AssemblyNameGoesHere" />
          </converters>
        </jsonSerialization>
      </webServices>
    </scripting>
  </system.web.extensions>

0 принят

Мне удалось обойти это, изменив тип данных в поле «VoucherDate» в модели C # от DateTime до String. В настоящее время я не понимаю, почему это работает. Я также думаю, что должен быть лучший способ !?

JavaScript, C #, JSON, asp.net-MVC,
Похожие вопросы