如何从视图

时间:2016-06-29 20:30:35

标签: c# asp.net-mvc kendo-ui datepicker

在同样使用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将

的文本设置为等于dateArrayrecordDates但是,如果在浏览器上启用了调试,则会显示这两个变量为null的错误。页脚显示日历很好,但日期没有按预期突出显示。如果我将日期数组硬编码到JavaScript中,它会突出显示日期。我还尝试将查询创建的list直接传递到我的dates变量中,但结果是一样的。

我是网络应用程序开发的新手,所以我想如果我理解在访问页面时如何解释和运行代码,问题就可以解决。关于如何突出显示在代码隐藏中创建array的日期的任何想法?

1 个答案:

答案 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日周围都有灰色的盒子。