1

fullcalendar-asp-netプロジェクトを最新バージョンの fullcalendar スクリプトで更新しようとしています。そのプロジェクトは、1.4.7 バージョンの fullcalendar (非常に古い) と jquery 1.3.2 (これも非常に古い) を使用しています。私はそのプロジェクトの機能全体が好きなので、jquery 1.10.2 を使用して fullcalendar の 1.6.4 (最新) バージョンに更新してそのまま使用したいだけです (最終バージョンはそのバージョンの jquery に同梱されています)。

私が抱えている問題は、スクリプトを更新するときに、ハンドラーからイベントを表示できないことです。私が行った唯一の変更は、ページヘッダーのスクリプトを次のように変更することです。

  • Jquery 1.3.2 から 1.10.2
  • Jquery-UI を 1.10.3 に
  • FullCalendar 1.4.7 から 1.6.4

すべてのバックエンド メソッドが正常に動作しているため、新しいイベントを追加してデータベースに保存し、問題なく更新できます。ページをリロードすると、それらはすべて消えます (つまり、ロードされていません)。これは、ページロード時にカレンダーをロードする js コードです (簡素化のために不要なコードは削除されています)。

var calendar = $('#calendar').fullCalendar({
    events: "JsonResponse.ashx",
})

奇妙なことに、json の応答をイベントに直接コピー アンド ペーストすると、それらがすべて表示されます。コードは次のようになります。

var calendar = $('#calendar').fullCalendar({
    events: [{ id: '42', title: 'asdf', start: 1378771200, end: 1378944000, allDay: true, description: 'asdfasdf' },
        { id: '43', title: 'sadfsdf', start: 1378944000, end: 1379030400, allDay: true, description: 'asdfgadfasdfd' },
        { id: '44', title: 'asdf', start: 1379030400, end: 1379030400, allDay: true, description: 'asdfasdf' }]
})

fullcalendar のバージョン 1.4.7 と 1.6.4 の間で、イベントのロードに違いがあるはずだと考え始めました。ドキュメントを見ると、私とまったく同じことがわかります。JSON 文字列をイベントに送信するだけのアイデアではありませんか? ashx ハンドラーによって生成される JSON 文字列は正しいため、直接コピーして貼り付けると機能します。

私はここで少し迷っており、関連情報を検索して基本を読むのに十分な時間を無駄にしました. 誰かが私を正しい方向に向けることができることを期待して、ついにここに来ました。

注: 有効な JSON 文字列を作成し、 fullcalendar-asp-netプロジェクトから見つけることができるため、ashx コードは重要ではないと考えて書きませんでした。

ありがとう!

4

1 に答える 1

2

最後に、「 fullcalendar-asp-net」プロジェクトの元の ashx ハンドラーを変更することになりました。foreach ループで文字列にイベントを追加する代わりに、イベント リストを作成し、このコードで Json 文字列に変換しました。

System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
   new System.Web.Script.Serialization.JavaScriptSerializer();
   string sJSON = oSerializer.Serialize(tasksList);

   context.Response.Write(sJSON);

完全な ashx コードは次のようになります。

/// <summary>
/// Summary description for JsonResponse
/// </summary>
public class JsonResponse : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";

        //CONVERT FROM UTC TIMESTAMP TO LOCAL DATETIME
        DateTime start = ConvertFromTimeStamp(long.Parse(context.Request.QueryString["start"]));
        DateTime end = ConvertFromTimeStamp(long.Parse(context.Request.QueryString["end"]));

        List<int> idList = new List<int>();
        List<ImproperCalendarEvent> tasksList = new List<ImproperCalendarEvent>();

        //GENERATE JSON SERIALIZABLE EVENTS
        foreach (CalendarEvent cevent in EventDAO.getEvents(start, end))
        {
            tasksList.Add(new ImproperCalendarEvent
            {
                id = cevent.id,
                title = cevent.title,
                start = ConvertToTimestamp(Convert.ToDateTime(cevent.start).ToUniversalTime()).ToString(),
                end = ConvertToTimestamp(Convert.ToDateTime(cevent.end).ToUniversalTime()).ToString(),
                description = cevent.description,
                allDay = cevent.allDay,
            }
                );
            idList.Add(cevent.id);
        }

        context.Session["idList"] = idList;

        //SERIALIZE EVENTS TO STRING
        System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
         new System.Web.Script.Serialization.JavaScriptSerializer();
        string sJSON = oSerializer.Serialize(tasksList);

        //WRITE JSON TO RESPONSE OBJECT
        context.Response.Write(sJSON);
    }

    /// <summary>
    /// Converts a UTC transformed timestamp into a local datetime
    /// </summary>
    /// <param name="timestamp"></param>
    /// <returns></returns>
    private DateTime ConvertFromTimeStamp(long timestamp)
    {
        long ticks = (timestamp * 10000000) + 621355968000000000;
        return new DateTime(ticks, DateTimeKind.Utc).ToLocalTime();
    }

    private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

    private static long ConvertToTimestamp(DateTime value)
    {
        TimeSpan elapsedTime = value - Epoch;
        return (long)elapsedTime.TotalSeconds;
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

この質問をしたとき、そのハンドラーの代わりに Web メソッドを使用していたため、カレンダーを呼び出すための js コードが本来のものとは異なっていました。今、フルカレンダーの公式ドキュメントで説明されているのとまったく同じ方法を使用しています。お気に入り;

$('#calendar').fullCalendar({
events: '/myfeed.php', }); // for me, that is "JsonResponse.ashx"

現在、質問で言及したすべてのスクリプトの最新バージョンで動作します。Jquery 1.10.2、Jquery-UI 1.10.3、フルカレンダー 1.6.4。そして、それは完全に機能します!

その問題を理解するのに苦労した他の人が私のように苦しまないことを願っています:)

ありがとう!

于 2013-10-04T13:33:15.680 に答える