You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kentico 10.0 Event Calendar如何获取calItems_SelectionChanged事件?

解决方案:Kentico 10 Event Calendar 实现日期选中事件绑定 Repeater

我完全懂你的困扰——Kentico的Event Calendar依赖Transformations做渲染,没法直接用标准ASP.NET日历的calItems_SelectionChanged事件。针对你只做数据展示的场景,这里给你两个实用的解决思路:

方案一:前端AJAX + 后端WebMethod(推荐,无需修改核心控件)

这个方法通过前端捕捉日期点击,再用AJAX请求后端数据动态更新Repeater,不用改动Kentico的原生控件:

  1. 修改Event Calendar的日期单元格Transformation
    打开你当前使用的日期单元格Transformation,给每个可点击的日期元素添加点击事件,传递格式化后的日期值:
<td onclick="loadEventsForDate('{% GetDateTime(EventDate, 'yyyy-MM-dd') %}')" class="calendar-day">
    {% EventDayNumber %}
    <!-- 保留你原有的其他渲染内容 -->
</td>

用GetDateTime把日期转成后端易处理的yyyy-MM-dd格式,避免格式兼容问题。

  1. 编写前端AJAX请求函数
    在页面的<script>标签(或单独JS文件)里添加以下代码,用jQuery发送异步请求:
function loadEventsForDate(selectedDate) {
    $.ajax({
        type: "POST",
        url: "YourPageName.aspx/GetEventsByDate",
        data: JSON.stringify({ date: selectedDate }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(response) {
            // 直接渲染数据到Repeater的容器中
            var eventList = response.d;
            var htmlContent = "";
            eventList.forEach(item => {
                htmlContent += `<div class="event-item">
                    <h4>${item.Title}</h4>
                    <p>${item.Description}</p>
                </div>`;
            });
            $("#RepeaterWrapper").html(htmlContent);
        },
        error: function(xhr, status, error) {
            console.error("加载数据失败:" + error);
        }
    });
}

替换YourPageName.aspx为你的页面文件名,RepeaterWrapper是包裹Repeater的容器ID。

  1. 后端添加WebMethod处理数据查询
    在页面的代码后台(.aspx.cs)添加静态WebMethod,查询对应日期的事件数据:
using System.Web.Services;
using CMS.EventCalendar;
using CMS.DataEngine;
using System.Collections.Generic;
using System.Linq;

public partial class YourPageName : System.Web.UI.Page
{
    [WebMethod]
    public static List<EventData> GetEventsByDate(string date)
    {
        DateTime targetDate = DateTime.Parse(date);
        // 查询Kentico事件表中对应日期的数据(可根据你的实际存储调整)
        var events = EventInfoProvider.GetEvents()
            .WhereEquals("EventDate", targetDate.Date)
            .ToList();
        
        // 转换为前端可序列化的对象
        return events.Select(e => new EventData {
            Title = e.EventTitle,
            Description = e.EventDescription
        }).ToList();
    }

    // 辅助类用于数据序列化
    public class EventData
    {
        public string Title { get; set; }
        public string Description { get; set; }
    }
}
  1. 可选:用UpdatePanel实现服务器端绑定
    如果你更习惯用服务器端绑定Repeater,可以把Repeater放在UpdatePanel里,前端点击时触发异步回发:
function loadEventsForDate(selectedDate) {
    // 把选中日期存入隐藏字段
    $("#<%= hfSelectedDate.ClientID %>").val(selectedDate);
    // 触发UpdatePanel刷新
    __doPostBack("<%= upEventRepeater.ClientID %>", "");
}

后台在Page_Load中处理绑定逻辑:

protected void Page_Load(object sender, EventArgs e)
{
    if (ScriptManager.GetCurrent(this).IsInAsyncPostBack)
    {
        string selectedDate = hfSelectedDate.Value;
        if (!string.IsNullOrEmpty(selectedDate))
        {
            DateTime targetDate = DateTime.Parse(selectedDate);
            rptEvents.DataSource = EventInfoProvider.GetEvents().WhereEquals("EventDate", targetDate.Date);
            rptEvents.DataBind();
        }
    }
}

方案二:自定义Event Calendar控件(贴近标准ASP.NET使用习惯)

如果想完全模拟标准ASP.NET日历的事件模式,可以自定义控件继承Kentico的EventCalendar,添加SelectionChanged事件:

  1. 创建自定义控件类
    在App_Code文件夹下新建CustomEventCalendar.cs:
using System;
using System.Web.UI;
using CMS.EventCalendar;

public class CustomEventCalendar : EventCalendar
{
    // 定义SelectionChanged事件
    public event EventHandler<SelectedDateArgs> SelectionChanged;

    protected override void OnDayRender(TableCell cell, CalendarDay day)
    {
        base.OnDayRender(cell, day);
        
        // 给非当月日期以外的单元格添加点击回发事件
        if (!day.IsOtherMonth)
        {
            cell.Attributes.Add("onclick", Page.ClientScript.GetPostBackClientHyperlink(this, "Select:" + day.Date.ToString("yyyy-MM-dd")));
        }
    }

    protected override void RaisePostBackEvent(string eventArgument)
    {
        base.RaisePostBackEvent(eventArgument);
        
        // 判断是否是日期选中的回发请求
        if (eventArgument.StartsWith("Select:"))
        {
            string dateStr = eventArgument.Substring(7);
            DateTime selectedDate = DateTime.Parse(dateStr);
            // 触发自定义的SelectionChanged事件
            SelectionChanged?.Invoke(this, new SelectedDateArgs(selectedDate));
        }
    }
}

// 自定义事件参数,传递选中的日期
public class SelectedDateArgs : EventArgs
{
    public DateTime SelectedDate { get; }

    public SelectedDateArgs(DateTime date)
    {
        SelectedDate = date;
    }
}
  1. 在页面中使用自定义控件
    在.aspx页面注册并使用自定义控件:
<%@ Register TagPrefix="custom" Namespace="YourNamespace" Assembly="App_Code" %>

<custom:CustomEventCalendar ID="calItems" runat="server" OnSelectionChanged="calItems_SelectionChanged">
    <!-- 绑定你原有的Transformations配置 -->
</custom:CustomEventCalendar>

<asp:Repeater ID="rptEvents" runat="server">
    <!-- Repeater的ItemTemplate内容 -->
</asp:Repeater>
  1. 后台绑定SelectionChanged事件
    在代码后台添加事件处理方法:
protected void calItems_SelectionChanged(object sender, SelectedDateArgs e)
{
    // 根据选中日期查询数据并绑定Repeater
    DateTime targetDate = e.SelectedDate;
    rptEvents.DataSource = EventInfoProvider.GetEvents().WhereEquals("EventDate", targetDate.Date);
    rptEvents.DataBind();
}

这两个方案都能解决你的问题,方案一更轻量灵活,方案二更贴近标准ASP.NET的开发习惯,你可以根据自己的实际场景选择。

内容的提问来源于stack exchange,提问作者Arun Skaria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:01:11