服务器端筛选日期时间 kendo UI 的问题
本文关键字:UI 问题 kendo 时间 筛选 日期 服务器端 | 更新日期: 2023-09-27 18:30:56
我在使用DataSourceRequest过滤日期时间的服务器端时遇到问题。
我的 ShowProcesses.cshtml 中有一个网格。我通过javascript构建了kendo ui网格。我打开了服务器过滤和服务器排序。它看起来像这样(我踢了你不需要看到/知道的所有内容):
$("#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");
此 kendo UI 网格的一列包含日期时间(标题:进程日期时间,字段:错误日期时间)。可以筛选此列。/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 };
}
数据源请求包含筛选器、排序、数据、页面、页面大小等。筛选器的类型可以是 FilterDescriptor 或 CompositeFilterDescriptor。HomeModelGrid 是一个视图,其中包含用于创建结果的列。
如果我尝试过滤"进程日期时间"列(在文本框中输入日期),则会出现以下错误:在 Kendo.Mvc 中发生了类型为"System.ArgumentException"的异常.dll但未在用户代码中处理;其他信息:提供的表达式应具有字符串类型
我读过一篇文章,一个人建议将FilterDescriptor的MemberType设置为字符串。我试过了,但得到了这个错误:System.Core 中发生了类型为"System.InvalidOperationException"的异常.dll但未在用户代码中处理;其他信息:在类型"System.DateTime"和"System.String"之间没有定义强制运算符。
因此,它尝试将字符串转换为日期时间。因此,我将过滤器描述符的成员类型设置为日期时间,并得到以下错误:在 Kendo.Mvc 中发生了类型为"System.ArgumentException"的异常.dll但未在用户代码中处理;其他信息:提供的表达式应具有字符串类型
当我阅读本文时,我查找了 Filterdescriptor 用于筛选的值。那是一根绳子。我将过滤器描述符的值更改为日期时间,并收到此错误:在 Kendo.Mvc 中发生了类型为"System.ArgumentException"的异常.dll但未在用户代码中处理;其他信息:提供的表达式应具有字符串类型
我以前得到过这个..我真的不知道该怎么办。
更改成员类型并将字符串转换为日期时间后,筛选器描述符如下所示:
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
我找到了这个问题的解决方案。
我在 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
在控制器中,我可以将其转换为日期并使用它来过滤模型