C# iptor { Member=filter.Member, MemberType=filter.MemberType, Operator=FilterOperator.Is大于或等于, 值=下限 }); newFilter.FilterDescriptors.Add(新建FilterDescriptor { Member=filter.Member, MemberType=filter.MemberType, Operator=FilterOperator.IsLessThan, 值=上限 }); request.Filters[i]=newFilter; } } 返回请求; } }
备注:C# iptor { Member=filter.Member, MemberType=filter.MemberType, Operator=FilterOperator.Is大于或等于, 值=下限 }); newFilter.FilterDescriptors.Add(新建FilterDescriptor { Member=filter.Member, MemberType=filter.MemberType, Operator=FilterOperator.IsLessThan, 值=上限 }); request.Filters[i]=newFilter; } } 返回请求; } },c#,.net,asp.net-mvc-3,kendo-grid,datetimepicker,C#,.net,Asp.net Mvc 3,Kendo Grid,Datetimepicker,备注: DateTime截断器扩展基于 此方法仅在运算符为等于时才执行任何操作,因为如果选择“晚于”或类似选项,则默认行为也会起作用 此方法不关心任何现有的CompositeFilterDescriptors,因为表达式dateToSearch=2016-11-21 11:22:00和dateToSearch=2016-11-21 11:59:00毫无意义 对于DateTimeOffset值,也可以执行类似的操作 对的增强,假设您使用的是DateTime的简单日期部分,而根本不关心时间部分。处
截断器扩展基于DateTime
- 此方法仅在运算符为
时才执行任何操作,因为如果选择“晚于”或类似选项,则默认行为也会起作用等于
- 此方法不关心任何现有的
s,因为表达式CompositeFilterDescriptor
毫无意义dateToSearch=2016-11-21 11:22:00和dateToSearch=2016-11-21 11:59:00
- 对于
值,也可以执行类似的操作DateTimeOffset
DateTime
的简单日期部分,而根本不关心时间部分。处理与其他不相关的过滤器一起过滤也是递归的
public static IList<IFilterDescriptor> NormalizeDateFilters(this IList<IFilterDescriptor> filters)
{
for (var i = 0; i < filters.Count; i++)
{
if (filters[i] is CompositeFilterDescriptor compositeFilterDescriptor)
{
compositeFilterDescriptor.FilterDescriptors.NormalizeDateFilters();
}
else if (filters[i] is FilterDescriptor filterDescriptor &&
filterDescriptor.ConvertedValue is DateTime &&
filterDescriptor.Operator == FilterOperator.IsEqualTo)
{
var value = DateTime.Parse(filterDescriptor.Value.ToString());
var start = value.Date;
var end = start.AddDays(1);
var newFilter = new CompositeFilterDescriptor
{
LogicalOperator = FilterCompositionLogicalOperator.And
};
newFilter.FilterDescriptors.Add(new FilterDescriptor
{
Member = filterDescriptor.Member,
MemberType = filterDescriptor.MemberType,
Operator = FilterOperator.IsGreaterThanOrEqualTo,
Value = start
});
newFilter.FilterDescriptors.Add(new FilterDescriptor
{
Member = filterDescriptor.Member,
MemberType = filterDescriptor.MemberType,
Operator = FilterOperator.IsLessThan,
Value = end
});
filters[i] = newFilter;
}
}
return filters;
}
公共静态IList规范化数据过滤器(此IList过滤器)
{
对于(var i=0;i
非常感谢。它解决了我在date和datetime列的情况下的问题,但我仍然有问题,如果我在剑道网格中有时间列。嗨,如何对这个类进行单元测试?我不知道如何模拟它并在测试中使用。您的代码对我帮助很大;)
<script type="text/javascript">
function DateTimeFilter(control)
{
$(control).kendoDateTimePicker();
}
</script>
function DateTimeFilter(control)
{
$(control).kendoDateTimePicker({
format: "MM/dd/yyyy HH:mm:ss",
timeFormat: "HH:mm:ss"
});
}
public static class KendoHelpers
{
public enum DateTimePrecision
{
Seconds = 1,
Minutes = 2,
Hours = 4
}
public static DataSourceRequest NormalizeDateFilters(this DataSourceRequest request, DateTimePrecision precision)
{
// TODO: Add parameter validation.
for (int i = 0; i < request.Filters.Count; ++i)
{
FilterDescriptor filter = request.Filters[i] as FilterDescriptor;
if (filter != null && filter.ConvertedValue is DateTime && filter.Operator == FilterOperator.IsEqualTo)
{
DateTime val = (DateTime)filter.ConvertedValue;
CompositeFilterDescriptor newFilter = new CompositeFilterDescriptor
{
LogicalOperator = FilterCompositionLogicalOperator.And
};
DateTime lowerBound;
DateTime upperBound;
if (precision == DateTimePrecision.Seconds)
{
lowerBound = val.TruncateToWholeSeconds();
upperBound = lowerBound.AddSeconds(1);
}
else if (precision == DateTimePrecision.Minutes)
{
lowerBound = val.TruncateToWholeMinutes();
upperBound = lowerBound.AddMinutes(1);
}
else if (precision == DateTimePrecision.Hours)
{
lowerBound = val.TruncateToWholeHours();
upperBound = lowerBound.AddHours(1);
}
else
{
// If someone would be stupid enough to supply Hours | Minutes
throw new ArgumentException("Not supported precision. Only Second, Minute, Hour values are supported.", "precision");
}
newFilter.FilterDescriptors.Add(new FilterDescriptor
{
Member = filter.Member,
MemberType = filter.MemberType,
Operator = FilterOperator.IsGreaterThanOrEqualTo,
Value = lowerBound
});
newFilter.FilterDescriptors.Add(new FilterDescriptor
{
Member = filter.Member,
MemberType = filter.MemberType,
Operator = FilterOperator.IsLessThan,
Value = upperBound
});
request.Filters[i] = newFilter;
}
}
return request;
}
}
public static IList<IFilterDescriptor> NormalizeDateFilters(this IList<IFilterDescriptor> filters)
{
for (var i = 0; i < filters.Count; i++)
{
if (filters[i] is CompositeFilterDescriptor compositeFilterDescriptor)
{
compositeFilterDescriptor.FilterDescriptors.NormalizeDateFilters();
}
else if (filters[i] is FilterDescriptor filterDescriptor &&
filterDescriptor.ConvertedValue is DateTime &&
filterDescriptor.Operator == FilterOperator.IsEqualTo)
{
var value = DateTime.Parse(filterDescriptor.Value.ToString());
var start = value.Date;
var end = start.AddDays(1);
var newFilter = new CompositeFilterDescriptor
{
LogicalOperator = FilterCompositionLogicalOperator.And
};
newFilter.FilterDescriptors.Add(new FilterDescriptor
{
Member = filterDescriptor.Member,
MemberType = filterDescriptor.MemberType,
Operator = FilterOperator.IsGreaterThanOrEqualTo,
Value = start
});
newFilter.FilterDescriptors.Add(new FilterDescriptor
{
Member = filterDescriptor.Member,
MemberType = filterDescriptor.MemberType,
Operator = FilterOperator.IsLessThan,
Value = end
});
filters[i] = newFilter;
}
}
return filters;
}