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的原生控件:
- 修改Event Calendar的日期单元格Transformation
打开你当前使用的日期单元格Transformation,给每个可点击的日期元素添加点击事件,传递格式化后的日期值:
<td onclick="loadEventsForDate('{% GetDateTime(EventDate, 'yyyy-MM-dd') %}')" class="calendar-day"> {% EventDayNumber %} <!-- 保留你原有的其他渲染内容 --> </td>
用GetDateTime把日期转成后端易处理的yyyy-MM-dd格式,避免格式兼容问题。
- 编写前端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。
- 后端添加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; } } }
- 可选:用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事件:
- 创建自定义控件类
在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; } }
- 在页面中使用自定义控件
在.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>
- 后台绑定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
相关产品推荐
相关产品推荐

