Использование HTTPHandler в C # .NET 3.5 с jQuery Week Calendar - PullRequest
1 голос
/ 20 сентября 2010

Я уже несколько недель пытаюсь заставить это работать, но все безрезультатно.Я уверен, что мой код должен провалиться из-за чего-то довольно маленького и глупого, но, попробовав несколько разных подходов, я начинаю по-настоящему бороться с проблемой.Кто-нибудь еще смог получить Календарь Недели jQuery (http://github.com/themouette/jquery-week-calendar), работающий с HTTPHandler, возвращающим JSON?

Я пробовал:

  1. Жесткое кодирование JSONвыйти из обработчика в виде строки (например, «events: [{etc}]»)
  2. Попытка с или без начальных «events»:
  3. Использование LINQ для извлечения данных, затемсериализация с использованием JavaScriptSerializer
  4. Использование взамен DataContractJsonSerializer
  5. Создание метода ToJSON с указанным выше
  6. Использование $ .getJson для извлечения данных
  7. Использование взамен $ .get
  8. Использование $ .ajax с "async = false"
  9. Ввод вызова данных в функцию, затем вызов функции с помощью:
    data: function(start, end, callback) {
        callback(getData());
    }

Нетиз которых, кажется, работает. Я даже пытался выполнить вызов данных перед кодом календаря, используя $ .get, $ getJSON и $ .ajax, например:

    $.getJSON('/content/handlers/GetScheduledAppointments.ashx', function(json) {
        $calendar.weekCalendar({
            .
            .
            .
            data: json
        });
    });

Я пробовал так много разных способовчто я не могу публиковать каждый пример кода, который терпит неудачу, но если кто-нибудь может мне помочь, я 'Я буду более чем рад опубликовать несколько примеров, если это необходимо.

Кто-нибудь сумел заставить эти две вещи работать вместе ...?

1 Ответ

3 голосов
/ 23 сентября 2010

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

Это для веб-форм C # .NET 3.5, а не MVC.

Во-первых, убедитесь, что свойства ContentType и ContentEncoding объекта Response установлены в JSON. В прошлом я использовал «text / plain», но мне кажется, что в этом случае это не работает:

context.Response.ContentType = "application/json";
context.Response.ContentEncoding = Encoding.UTF8;

При использовании LINQ создание нового объекта в том порядке и формате, которые ожидает календарь, поможет свести к минимуму проблемы с неточностями в данных. Если вам требуются встречи только для чтения, вы можете просто добавить эту опцию в список. Элемент «title» ниже работает как ISNULL или COALESCE в SQL, чтобы предотвратить возвращение нулей:

var apps = (
    from a in db.Appointments
    select new {
        id = a.id,
        start = a.startTime.Value,
        end = a.endTime.Value,
        title = a.subjectLine == null ? "" : a.subjectLine
    }).ToList();

Несмотря на то, что существует множество способов сериализации набора данных в JSON, я обнаружил, что самый простой способ - использовать библиотеку NewtonSoft Json.NET . Это так же просто, как добавление одной строки для создания объекта JSON с необходимым форматированием даты ISO8601:

return JsonConvert.SerializeObject(apps, new IsoDateTimeConverter());

Что касается стороны jQuery, я покажу только функцию "data:", так как это та часть, которая заставила меня потерпеть неудачу дольше всего:

data: function(start, end, callback) {
    $.ajax({
        url:        "/content/handlers/GetScheduledAppointments.ashx",
        type:       "GET",
        success:    function(json) {
            callback(json);
        },
        async:      false
    });
}

Удобный совет, касающийся дат, к которому я пришел, прежде чем начал использовать библиотеку Json.NET - если вы просто не можете заставить .NET возвращать даты в формате, который нравится jWC, то используйте библиотеку [Date.js для выполнения дополнительное форматирование в самом jQuery. В течение нескольких дней я не мог заставить свой сервер выводить время начала и окончания в формате, который будет отображаться в календаре, независимо от того, что я пробовал. Во всех действующих примерах (с локальными данными, генерируемыми в jQuery) даты создавались в следующем формате:

new Date(year, month, day, hour, minute)

Таким образом, используя эту основу, также можно явным образом приводить даты, возвращаемые из серверной части, так как библиотека Date.js будет принимать почти все, что приближается к дате, и использует свое волшебство:

data: function(start, end, callback) {
    $.ajax({
        url:        "/content/handlers/GetScheduledAppointments.ashx",
        type:       "GET",
        success:    function(json) {
            if ($.isArray(json)) { 
                $.each(json, function(key, value) { 
                    value.start = new Date(value.start); 
                    value.end = new Date(value.end); 
                });
            }
            callback(json);
        },
        async:      false
    });
}

Я знаю, что ничего из этого не очень легкомысленно (или даже оптимизировано), но, надеюсь, это может быть полезно некоторым людям, которые испытывают реальные трудности с jWC и .NET.

...