【问题标题】:Issue with serverside filtering datetime kendo ui服务器端过滤日期时间剑道 ui 的问题
【发布时间】:2014-11-19 12:16:15
【问题描述】:

我在服务器端使用 DataSourceRequest 过滤日期时间时遇到问题。

我的 ShowProcesses.cshtml 中有一个网格。我通过javascript构建了那个剑道ui网格。我打开了 serverFiltering 和 serverSorting。它看起来像这样(我踢了你不需要看到/知道的一切):

        $("#processGrid").kendoGrid({
            sortable: true,
            pageable: true,
            selectable: true,
            filterable: {
                extra: false
            },
            dataSource: {
                type: "aspnetmvc-ajax",
                transport: {
                    read: {
                        url: "/Home/GetProcesses",
                        cache: false,
                        type: "POST",
                        dataType: "json"
                    },
                    parameterMap: function (data) {
                        return $.extend({}, data, { sort: data.sort, filter: data.filter });
                    }
                },
                serverPaging: true,
                serverFiltering: true,
                serverSorting: true,
                page: "@ViewBag.ProcessPage",
                schema: { data: "Data", total: "Total", model: { id: "Id" } },
                pageSize: "@(@Model.MaxCountToShow)"
            },
            columns: [
                { field: "ErrorDateTime", title: "ProcessDateTime", width: "170px"/*, filterable: { ui: dateFilter }*/ },
                { field: "Name", title: "Processtype", attributes: { value: "type" }, width: "240px;", filterable: { ui: processtypeFilter} },
                { field: "Service", title: "Service", width: "181px;", filterable: { ui: serviceFilter } },
                { field: "Operation", title: "Operation", width: "130px", filterable: { ui: operationFilter } }
            ]
        }).data("kendoGrid");

此剑道 ui 网格的一列包含日期时间(标题:ProcessDateTime,字段:ErrorDateTime)。可以过滤此列。 /Home/GetProcesses 如下所示:

    public JsonResult GetProcesses([DataSourceRequest] DataSourceRequest request)
    {
      var result = homeModel.HomeModelGrid.ToDataSourceResult(request, p => new
        {
            Id = p.Id,
            ProcessDateTime = p.ProcessDateTime != null ? p.ProcessDateTime.ToString() : "",
            State = p.State,
            StateDetails = p.StateDetails != null ? p.StateDetails : "",
            Name = p.Name,
            Service = p.Service,
            Operation = p.Operation,
            ErrorDateTime = p.State == "Successful" || p.State == "Info" || p.State == "Warning" ? (p.ProcessDateTime != null ? p.ProcessDateTime.ToString() : "") : p.ErrorDateTime.ToString()

        });

        return new JsonResult { Data = result, JsonRequestBehavior = JsonRequestBehavior.AllowGet, MaxJsonLength = Int32.MaxValue };
    }

DataSourceRequest 请求包含过滤器、排序、数据、页面、页面大小等。过滤器的类型为 FilterDescriptor 或 CompositeFilterDescriptor。 HomeModelGrid 是一个视图,其中包含用于创建结果的列。

如果我尝试过滤 ProcessDateTime 列(您在文本框中输入日期),我会收到以下错误: “System.ArgumentException”类型的异常发生在 Kendo.Mvc.dll 中,但未在用户代码中处理; 附加信息:提供的表达式应该是字符串类型

我读过一篇文章,其中有人建议将 FilterDescriptor 的 MemberType 设置为字符串。我试了一下,得到了这个错误: System.Core.dll 中发生了“System.InvalidOperationException”类型的异常,但未在用户代码中处理; 附加信息:在类型“System.DateTime”和“System.String”之间没有定义强制运算符。

因此,它尝试将字符串转换为日期时间。因此,我将 FilterDescriptor 的 MemberType 设置为 DateTime 并得到以下错误: “System.ArgumentException”类型的异常发生在 Kendo.Mvc.dll 中,但未在用户代码中处理; 附加信息:提供的表达式应该是字符串类型

在阅读本文时,我查找了 Filterdescriptor 用于过滤的值。那是一个字符串。我将 FilterDescriptor 的值更改为 DateTime 并收到此错误: “System.ArgumentException”类型的异常发生在 Kendo.Mvc.dll 中,但未在用户代码中处理; 附加信息:提供的表达式应该是字符串类型

我之前有过这个。。我真的不知道该怎么办。

更改 MemberType 并将字符串转换为日期时间后,FilterDescriptor 如下所示:

FilterDescriptor: 
  ConvertedValue: {03.11.2014 00:00:00}
  Member:  "ErrorDateTime"
  MemberType: {Name="DateTime" FullName="System.DateTime"}
  Operator: StartsWith
  Value: {03.11.2014 00:00:00}

以前是这样的:

FilterDescriptor: 
  ConvertedValue: "3.11.2014"
  Member:  "ErrorDateTime"
  MemberType: null
  Operator: "StartsWith"
  Value: "3.11.2014"

我真的不知道如何让它工作。我很欣赏任何见解。谢谢和Ciao

【问题讨论】:

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


    【解决方案1】:

    我找到了解决这个问题的方法。

    我在 ajax 调用的数据中添加了一个函数。在那里,我遍历过滤器并获取包含日期的过滤器。我更改了它的值,以便可以在我的控制器中使用它。您可以使用:

    kendo.toString(new Date(filters[m].value), "dd.MM.yyyy")
    

    或者:

    //this is in the *data: function(){}* of the ajax call
    var newout = reformDate(filters[m].value.toString());
    
    //function which formats the date
    function reformDate(input){
        var year = input.slice(-4),
            month = ['Jan','Feb','Mar','Apr','May','Jun',
                     'Jul','Aug','Sep','Oct','Nov','Dec'].indexOf(input.substr(4,3))+1,
           day = input.substr(8,2);
    
        var output = (day<10?'0':'') + day.trim() + '.' 
                       + (month<10?'0':'') + month + '.' + year;
        return output;
    }
    

    字符串的格式为:dd.MM.yyyy

    在控制器中,我可以将其转换为日期并使用它来过滤模型

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 2021-10-03
      • 2018-03-27
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多