如何移除MVC Kendo Grid数值列筛选的Contains选项?
解决Kendo Grid数值列出现字符串筛选选项的问题
我之前也碰到过类似的情况,咱们来一步步拆解问题和解决方案:
问题根源分析
首先,你的模型字段明明是decimal类型,但Kendo Grid却给这些列加载了字符串类型的筛选器(比如"Contains"),大概率是配置冲突或者类型识别异常导致的。仔细对比你两个页面的代码,我发现了几个可能的关键点:
重复调用
.Operators()导致配置覆盖
你第一页的Filterable配置里,分开两次调用了.Operators()方法:先配置字符串筛选器,再配置数值筛选器。Kendo的配置API中,多次调用.Operators()可能会重置之前的配置,导致全局筛选器规则混乱,Grid无法正确识别列的类型对应筛选器。ClientTemplate可能干扰类型识别
虽然你用kendo.toString把数值格式化成货币字符串,但正常情况下Grid应该还是能通过模型字段类型判断筛选器类型。不过有时候前端渲染时的格式转换会让Grid误判,这时候就需要手动指定筛选器类型。
具体解决方案
方案1:合并全局Operators配置
把字符串和数值的筛选器规则放在同一个.Operators()调用里,避免配置覆盖:
.Filterable(ftb => ftb.Mode(GridFilterMode.Menu) .Extra(false) .Operators(operators => operators // 配置字符串列的筛选器 .ForString(str => str.Clear() .Contains("Contains") .IsEqualTo("EqualTo") .IsNotEqualTo("NotEqualTo") .IsEmpty("Empty")) // 配置数值列的筛选器 .ForNumber(num => num.Clear() .IsEqualTo("EqualTo") .IsGreaterThan("GreaterThan") .IsLessThan("LessThan")) ) .Messages(m => m.IsFalse(" False ")) .Messages(m => m.IsTrue("True ")) )
方案2:给数值列强制指定筛选器类型
如果全局配置还是有问题,可以直接在列的配置中明确指定筛选器规则,覆盖全局设置:
columns.Bound(x => x.DebitAmount) .Title("Debit") .Width(300) .ClientTemplate("#=kendo.toString(DebitAmount,'c') #") .ClientFooterTemplate("#=kendo.toString(sum,'c') #") .Filterable(f => f .Operators(op => op .ForNumber(num => num .Clear() .IsEqualTo("EqualTo") .IsGreaterThan("GreaterThan") .IsLessThan("LessThan") ) ) ); // CreditAmount列同理 columns.Bound(x => x.CreditAmount) .Title("Credit") .Width(300) .ClientTemplate("#=kendo.toString(CreditAmount,'c') #") .ClientFooterTemplate("#=kendo.toString(sum,'c') #") .Filterable(f => f .Operators(op => op .ForNumber(num => num .Clear() .IsEqualTo("EqualTo") .IsGreaterThan("GreaterThan") .IsLessThan("LessThan") ) ) );
方案3:明确DataSource模型字段类型
在Grid的DataSource配置中,手动标记数值字段的类型,确保前端能正确识别:
.DataSource(dataSource => dataSource .Ajax() .Model(model => { model.Field(x => x.DebitAmount).Type("number"); model.Field(x => x.CreditAmount).Type("number"); }) // 其他DataSource配置(如Read、Sort等) )
为什么第二页正常?
第二页的配置虽然看起来和第一页类似,但可能Grid在绑定的时候,刚好正确识别了Amount字段的decimal类型,加上全局配置没有因为重复调用.Operators()出现冲突,所以自动加载了数值筛选器。
内容的提问来源于stack exchange,提问作者gene
相关产品推荐
相关产品推荐

