【问题标题】:How should I handle a JSON feed that returns no result?我应该如何处理不返回结果的 JSON 提要?
【发布时间】:2021-11-10 19:42:31
【问题描述】:

请原谅我的第一个问题和一般的经验不足。我正在使用 FullCalendar 5.10.1 返回与节日动态关联的事件。

此实例使用文档中的“事件(作为 json 提要)”模式。在所有情况下,如果有一个事件与动态选择的节日相关联,那么一切都很好。日历与事件正确显示。

但是,如果提要没有找到至少一个与节日选择相关的事件,则会立即返回失败回调。此时,控制台显示错误“解析 JSON 失败”。如果通过单击“确定”关闭失败回调消息,则按预期加载空日历。

很明显,我没有处理这种情况(无事件),但我不确定是否需要在提要 SQL 或 FullCalendar 代码中处理它。

请注意,这在 Bootstrap 选项卡内运行。我在这里留下了一些 hacky 代码,将 var 设置为日历选项卡的 id 并延迟日历加载以解决供应商主题的争用问题。

我很确定我没有以首选方式在这里显示代码,并且可能没有足够仔细地描述问题。但是对于这个新手的任何见解将不胜感激。

<script type="text/javascript">

  document.addEventListener('DOMContentLoaded', function() {
    var calendarButton = document.getElementById('calendarButton');
    var calendarEl = document.getElementById('calendar');
    var calendar = new FullCalendar.Calendar(calendarEl, {

      themeSystem: 'bootstrap',
      headerToolbar: {
        left: 'prev,next today',
        center: 'title',
        right: 'dayGridMonth,timeGridWeek,timeGridDay'
      },
      weekNumberCalculation: "ISO",
      initialView: 'dayGridMonth',
      initialDate: '2021-07-01',
      eventDidMount: function(info) {
        $(info.el).tooltip({
          title: info.event.extendedProps.description,
          placement: 'top',
          trigger: 'hover',
          container: 'body'
        });
      },
      eventSources: [
        {
          url: '/DesktopModules/XModPro/Feed.aspx',
          method: 'POST',
          datatype: 'JSON',
          extraParams: {
            pid: '0',
            xfd: 'Events_FullCalendar_FestivalID',
            FestivalID: '[[FestivalID]]'
          },
          failure: function() {
            alert('There was an error while fetching events!');
          },

          color: '#a1a535',   // a non-ajax option
          textColor: 'white' // a non-ajax option
        }
      ]
    });

    calendarButton.addEventListener('click', e => {
      setTimeout(() => {calendar.render()}, 1);
    });
  });
</script>

馈送 SQL

<%@ Control Language="vb" AutoEventWireup="false" Inherits="KnowBetter.XModPro.FeedBase" %>
<%@ Register Assembly="KnowBetter.XModPro.Web.Controls" Namespace="KnowBetter.XModPro.Web.Controls" TagPrefix="xmod" %>
<xmod:masterview runat="server">
<xmod:JsonFeed runat="server">              
 
<ListDataSource CommandText="SELECT
                             EventID AS 'id',
                             VenueID AS 'vid',
                             FestivalID,
                             EventTitle AS 'title',
                             EventDescription AS 'description',
                             EventStartTime AS 'start',
                             EventEndTime AS 'end'

                            FROM la360_Event
                            WHERE FestivalID = @FestivalID">

<Parameter Name = "FestivalID" value= '<%#FormData("FestivalID")%>' DataType="string" />
</ListDataSource>

</xmod:JsonFeed></xmod:masterview>

【问题讨论】:

  • 您有机会更改(或请求更改)Feed 的代码吗?当没有事件时,它应该返回一个空数组。听起来目前它正在返回 null,这确实是一个设计缺陷。响应类型在所有情况下都应该是一致的。这是迄今为止解决此问题的最佳方法。
  • 是的,我确实可以访问提要。我已经验证当前提要确实返回 null,而不是空数组 []。我已编辑问题以包含提要 SQL。我不清楚如何确保空数组与空数组的返回。到目前为止,搜索 SO 还没有提供任何见解。感谢您的帮助,并对已清理的原始格式问题表示歉意。
  • 谢谢。 Feed.aspx 的代码在哪里?我认为不仅仅是那个数据源,否则它不会把它变成 JSON
  • 上面的 SQL 是使用 CMS (DNN) 的插件 (XModPro) 编写的。此 SQL 所在的提要模块似乎继承了我无法引用的其他 XModPro 代码。不幸的。一个多星期前,我在他们的支持论坛上发布了这个问题,但没有任何回应。此时,它似乎是一个不受支持的模块。所以我担心我必须找到一个 hacky 工作。
  • 您可以编写自己的小 asp.net 脚本来运行相同的查询,但将其正确转换为 JSON 吗?我不具体了解这个 CMS,但大多数都允许您添加自定义代码。

标签: javascript json ajax fullcalendar fullcalendar-5


【解决方案1】:

我会留下我的“解决方案”,希望它能在未来对某人有所帮助。我只是使用 UNION 将空事件记录添加到提要结果中,以便在没有“真实”事件时 FullCalendar 仍然有效。也许不是最优雅或写得最好的语法,但 FullCalendar 很高兴,我也很高兴。

<ListDataSource CommandText="SELECT
                         null AS 'id',
                         null AS 'vid',
                         null AS 'FestivalID',
                         null AS 'title',
                         null AS 'description',
                         null AS 'start',
                         null AS 'end'
                         
                         UNION
                                               
                         SELECT
                         EventID AS 'id',
                         VenueID AS 'vid',
                         FestivalID,
                         EventTitle AS 'title',
                         EventDescription AS 'description',
                         EventStartTime AS 'start',
                         EventEndTime AS 'end'

                         FROM la360_Event
                         WHERE FestivalID = @FestivalID">

                        <Parameter Name = "FestivalID" value= '[[Form:FestivalID]]' DataType="int32"/>

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 2015-11-10
    • 2017-02-04
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多