在同样使用Entity Framework的asp.NET MVC项目中使用Telerik的KendoUI DatePicker。我在现有项目中添加了一项增强功能,以便在Oracle数据库中存在该日期的记录时突出显示DatePicker上的日期。
在视图中:
@{
var dateList = HelperMethodClass.GetRecordDates(model);
var dateString = dateList.Aggregate("", (current, date) => current + (date.Equals(dateList.Last()) ? date.ToString("yyyy-MM-dd") : date.ToString("yyyy-MM-dd") + ","));
}
GetRecordDates()
是HelperMethodClass
中的一种方法,它在数据库中查询所有日期,并传递model
的记录。我格式化它以便以后可以控制解析(见下文)。稍后在同一视图的表格中,DatePicker
放置在表格中,我存储dates
变量以引入另一个.cshtml
页面(位于视图 - >下)共享 - >项目的EditorTemplates文件夹):
<div class="leftActions">
<input type="hidden" id="myDates" value="@dateString" />
<table>
<tr>
<td>@Html.EditorFor(m => m.Date, new {@sourcePage = "MyView"})</td>
<tr>
</table>
</div>
这是另一个.cshtml页面:
@model DateTime?
@{
var calendar = Html.Kendo().DatePickerFor(m => m).Format("yyyy-MM-dd");
if (ViewData["sourcePage"] == "MyView")
{
calendar.Footer("<p>" + DateTime.Today.ToLongDateString() + "</p><span id=\"legend\">Record Exists<span>");
calendar.MonthTemplate("# if ($.inArray(+data.date, recordDates) != -1) { #" + "<div class=\"reportDate\">" +
"</div>" + "# } #" + "#= data.value #");
}
}
<span style="width: 6em">
@calendar
</span>
<script>
var dates = $('#myDates');
var dateArray = dates.toString().split(',');
var recordDates = d(dateArray);
function d(x) {
var myArray = [];
for (var i = 0; i < x.length; i++) {
myArray.push(new Date(x[i].substring(0, 4), x[i].substring(5, 7), x[i].substring(8)));
}
return myArray;
};
</script>
<style>
#legend, .reportDate {
background-color:rgba(0,0,0,.2);
}
.reportDate {
position: absolute;
width: 32px;
height: 28px;
}
</style>
我相信我的问题是当我到达EditorTemplate文件时(实际创建了DatePicker
)。我在代码隐藏GetRecordDates()
方法中设置了一个断点来查看发生了什么。 View变量按预期工作,EditorTemplate中的dates
变量正在按预期从View中提取日期字符串,但它停止的位置。我尝试在视图中放置一个
,并在EditorTemplate中使用.innerHtml将
的文本设置为等于dateArray
或recordDates
但是,如果在浏览器上启用了调试,则会显示这两个变量为null
的错误。页脚显示日历很好,但日期没有按预期突出显示。如果我将日期数组硬编码到JavaScript
中,它会突出显示日期。我还尝试将查询创建的list
直接传递到我的dates
变量中,但结果是一样的。
我是网络应用程序开发的新手,所以我想如果我理解在访问页面时如何解释和运行代码,问题就可以解决。关于如何突出显示在代码隐藏中创建array
的日期的任何想法?
答案 0 :(得分:1)
我能够在我的一个视图中让你的代码工作(释义),但我不得不对d()函数进行一些更改。
我改变了
var dates = $('#myDates');
到
var dates = $('#myDates').val();
和
myArray.push(new Date(x[i].substring(0, 4), x[i].substring(5, 7), x[i].substring(8)));
到
myArray.push(new Date(x[i].substring(0, 4), x[i].substring(5, 7) - 1, x[i].substring(8)).getTime());
然后,它使用硬编码的日期字符串为我工作:
@{
var dateString = "2016-06-28,2016-06-29";
}
问题是没有.val(),recordDates不包含任何有效日期而没有.getTime()
$.inArray(+data.date, recordDates)
将数字日期与日期对象进行比较。
一旦我把它们都作为数字,我的6月28日和29日周围都有灰色的盒子。