Формат даты ASP.NET MVC JsonResult - PullRequest
226 голосов
/ 07 апреля 2009

У меня есть действие контроллера, которое фактически просто возвращает JsonResult моей модели. Итак, в моем методе у меня есть что-то вроде следующего:

return new JsonResult(myModel);

Это работает хорошо, за исключением одной проблемы. В модели есть свойство date, которое, по-видимому, возвращается в результате Json:

"\/Date(1239018869048)\/"

Как мне обращаться с датами, чтобы они возвращались в нужном мне формате? Или как мне обработать этот формат выше в сценарии?

Ответы [ 23 ]

2 голосов
/ 07 июля 2010

Я работал над решением этой проблемы, так как ни один из приведенных выше ответов действительно не помог мне. Я работаю с календарем недели jquery, и мне нужно, чтобы мои даты содержали информацию о часовом поясе на сервере и локально на странице. Немного покопавшись, я нашел решение, которое может помочь другим.

Я использую asp.net 3.5, 2008 г., asp.net MVC 2 и календарь недели jquery,

Во-первых, я использую библиотеку, написанную Стивеном Левитаном, которая помогает работать с датами на стороне клиента, Библиотека дат Стивена Левитана . Формат isoUtcDateTime идеально подходит для того, что мне нужно. В моем вызове jquery AJAX я использую функцию форматирования, предоставляемую библиотекой с форматом isoUtcDateTime, и когда вызов ajax затрагивает мой метод действия, тип datetime Kind устанавливается на local и отражает время сервера.

Когда я отправляю даты на свою страницу через AJAX, я отправляю их в виде текстовых строк, форматируя даты с использованием «ddd, dd MMM гггг ЧЧ ':' мм ':' ss 'GMT'zzzz". Этот формат легко конвертируется на стороне клиента с помощью

var myDate = new Date(myReceivedDate);

Вот мое полное решение без источника Стива Левитана, которое вы можете скачать:

Контроллер:

public class HomeController : Controller
{
    public const string DATE_FORMAT = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'zzzz";

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }


    public JsonResult GetData()
    {
        DateTime myDate = DateTime.Now.ToLocalTime();

        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }

    public JsonResult ReceiveData(DateTime myDate)
    {
        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }
}

Javascript:

<script type="text/javascript">

function getData() {
    $.ajax({
        url: "/Home/GetData",
        type: "POST",
        cache: "false",
        dataType: "json",
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
            sendData(newDate);
        }
    });
} 

function cleanDate(d) {
    if (typeof d == 'string') {
        return new Date(d) || Date.parse(d) || new Date(parseInt(d));
    }
    if (typeof d == 'number') {
        return new Date(d);
    }
    return d;
}

function sendData(newDate) {
    $.ajax({
        url: "/Home/ReceiveData",
        type: "POST",
        cache: "false",
        dataType: "json",
        data:
        {
            myDate: newDate.format("isoUtcDateTime")
        },
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
        }
    });
}

// bind myButton click event to call getData
$(document).ready(function() {
    $('input#myButton').bind('click', getData);
});
</script>

Надеюсь, этот быстрый пример поможет другим в той же ситуации, в которой я находился. В настоящее время он, похоже, очень хорошо работает с сериализацией Microsoft JSON и сохраняет мои даты правильными во всех часовых поясах.

2 голосов
/ 06 июля 2014

Лучший способ обрабатывать даты в knockoutjs - использовать библиотеку моментов и обрабатывать даты, как босс. Вы можете легко иметь дело с датами, такими как / Дата (-62135578800000) /. Не нужно беспокоиться о том, как ваша дата сериализации в контроллере.

function jsonToDate(date,format) {
   return moment(date).format(format);
}

используйте это как

var formattedDate = jsonToDate(date,'MM/DD/YYYY')

momentjs поддерживает множество форматов даты и времени и функции полезности для дат.

1 голос
/ 09 мая 2013

Вы можете использовать этот метод:

String.prototype.jsonToDate = function(){
    try{
        var date;
        eval(("date = new " + this).replace(/\//g,''));
        return date;
    } 
    catch(e){
        return new Date(0);
    }
};
1 голос
/ 05 марта 2011

Формат даты в запросе.

var _myModel = from _m in model.ModelSearch(word)
    select new { date = ((DateTime)_m.Date).ToShortDateString() };

Единственная проблема с этим решением состоит в том, что вы не получите никаких результатов, если ЛЮБОЕ из значений даты равно нулю. Чтобы обойти это, вы можете добавить условные операторы в ваш запрос ДО того, как вы выберете дату, которая игнорирует нулевые значения даты, или вы можете настроить запрос, чтобы получить все результаты, а затем перебрать всю эту информацию с помощью цикла foreach и присвоить значение на все даты, которые являются нулевыми, прежде чем вы сделаете ваш SELECT новым.

Пример обоих:

var _test = from _t in adc.ItemSearchTest(word)
                        where _t.Date != null
                        select new { date = ((DateTime)_t.Date).ToShortDateString() };

Второй вариант требует еще одного запроса, поэтому вы можете присваивать значения всем нулям. Это и цикл foreach должны быть ДО вашего запроса, который выбирает значения.

var _testA = from _t in adc.ItemSearchTest(word)
                         select _i;

            foreach (var detail in _testA)
            {
                if (detail.Date== null)
                {
                    detail.Date= Convert.ToDateTime("1/1/0001");
                }
            }

Просто идея, которую я нашел проще, чем все примеры javascript.

0 голосов
/ 02 февраля 2016

Раздражает, не правда ли?

Мое решение состояло в том, чтобы изменить мою службу WCF, чтобы она возвращала DateTimes в более читаемом (не Microsoft) формате. Обратите внимание, ниже, «UpdateDateOriginal», который является форматом дат WCF по умолчанию, и мой «UpdateDate», который отформатирован во что-то более читаемое.

enter image description here

Вот как это сделать:

Изменение формата даты WCF

Надеюсь, это поможет.

0 голосов
/ 12 августа 2015

Переопределите контроллеры Json / JsonResult, чтобы вернуть JSON.Net:

.

Это работает удовольствие

0 голосов
/ 07 февраля 2015

Для меня сработало создание модели представления, содержащей свойство даты в виде строки. Присвоение свойства DateTime из модели домена и вызов .ToString () для свойства date при присвоении значения модели представления.

Результат JSON метода действия MVC вернет дату в формате, совместимом с представлением.

Просмотр модели

public class TransactionsViewModel
{
    public string DateInitiated { get; set; }
    public string DateCompleted { get; set; }
}

Модель домена

public class Transaction{
   public DateTime? DateInitiated {get; set;}
   public DateTime? DateCompleted {get; set;}
}

Метод действия контроллера

public JsonResult GetTransactions(){

var transactions = _transactionsRepository.All;
        var model = new List<TransactionsViewModel>();

        foreach (var transaction in transactions)
        {
            var item = new TransactionsViewModel
            {
                ...............
                DateInitiated = transaction.DateInitiated.ToString(),
                DateCompleted = transaction.DateCompleted.ToString(),
            };

            model.Add(item);
        }
        return Json(model, JsonRequestBehavior.AllowGet);
}
0 голосов
/ 13 августа 2013

Не даром, но есть и другой способ. Сначала создайте запрос LINQ. Затем создайте запрос результата Enumerated и примените любой тип форматирования, который вам подходит.

var query = from t in db.Table select new { t.DateField };
var result = from c in query.AsEnumerable() select new { c.DateField.toString("dd MMM yyy") };

Я должен сказать, что дополнительный шаг раздражает, но он прекрасно работает.

0 голосов
/ 08 марта 2013

Вот некоторый код JavaScript, который я написал, который устанавливает значение <input type="date"> из даты, переданной из ASP.NET MVC.

    var setDate = function (id, d) {
    if (d !== undefined && d !== null) {
        var date = new Date(parseInt(d.replace("/Date(", "").replace(")/", ""), 10));
        var day = ('0' + date.getDate()).slice(-2);
        var month = ('0' + (date.getMonth() + 1)).slice(-2);
        var parsedDate = date.getFullYear() + "-" + (month) + "-" + (day);
        $(id).val(parsedDate);
    }
};

Вы вызываете эту функцию так:

setDate('#productCommissionStartDate', data.commissionStartDate);

Где CommissionStartDate - дата JSON, переданная MVC.

0 голосов
/ 21 февраля 2018

Самый простой:

var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", ""));
Var newDate = new Date (milisegundos). toLocaleDateString ("en-UE");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...