Kendo Grid配置:学生ID仅新增时可编辑,其余状态不可编辑
解决Kendo Grid中已有行ID不可编辑、新增行ID可编辑的问题
你遇到的这个问题很典型——全局设置model.Field(p => p.ID).Editable(false)会把新增行的ID编辑权限也一并锁死,我们需要动态判断行的状态来精准控制编辑权限,下面是两种可行的解决方案:
方案一:利用列的Editable函数动态判断(推荐)
这种方法最简洁直接,通过给ID列指定一个判断函数,根据当前行是否为新增行来决定是否允许编辑:
1. 修改Grid列配置
把你原来的ID列配置替换成下面的代码,同时去掉全局的Editable(false)设置:
@(Html.Kendo().Grid(Model) .Name("StudentModel") .Columns(column => { // 重点:用Editable("isIDEditable")替代全局不可编辑设置 column.Bound(p => p.ID).Width(30).Editable("isIDEditable"); column.Bound(p => p.First_Name).Width(100); column.Bound(p => p.Last_Name).Width(100); column.Bound(p => p.Division).Width(30); // 其他列配置... }) .Editable(editable => editable.Mode(GridEditMode.InLine)) // 根据你的实际编辑模式调整,比如Popup .DataSource(dataSource => dataSource .Ajax() .Model(model => { model.Id(p => p.ID); // 不要在这里设置model.Field(p => p.ID).Editable(false) }) // 数据源的其他配置(如Create/Update/Read方法)... ) )
2. 添加判断用的JavaScript函数
在页面的<script>标签里添加这个函数,它会接收当前行的model对象,通过isNew()方法判断是否为新增行:
<script> function isIDEditable(model) { // 新增行返回true(允许编辑),已有行返回false(禁止编辑) return model.isNew(); } </script>
方案二:自定义EditorTemplate(适合需要自定义控件的场景)
如果你需要对ID的编辑控件做更复杂的定制,可以通过EditorTemplate来实现:
1. 创建ID的EditorTemplate
在Views/Shared/EditorTemplates文件夹下创建一个名为IDEditor.cshtml的文件,内容如下:
@model int? @* 判断是否为新增行:字段名包含"new"表示是新增的临时行 *@ @if (ViewData.TemplateInfo.GetFullHtmlFieldName("").Contains("new")) { @Html.TextBoxFor(m => m, new { @class = "k-textbox" }) } else { @* 已有行直接显示文本,不提供编辑控件 *@ @Html.DisplayFor(m => m) }
2. 在Grid列中引用这个模板
修改ID列的配置,引用刚创建的EditorTemplate:
column.Bound(p => p.ID).Width(30).EditorTemplateName("IDEditor");
为什么原来的方法不行?
model.Field(p => p.ID).Editable(false)是全局生效的配置,它会对所有行(包括新增的临时行)禁用编辑权限。而上面的两种方法都是通过判断行的状态(是否为新增)来动态控制权限,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Oniel Telies
相关产品推荐
相关产品推荐

