如何禁用弹出编辑器中某些列的编辑?

Posted

技术标签:

【中文标题】如何禁用弹出编辑器中某些列的编辑?【英文标题】:How to disable edits for certain columns in popup editor? 【发布时间】:2012-10-18 05:16:48 【问题描述】:

ASP.Net MVC 3、Kendo UI Web、Kendo 网格控件。

我将几个字段配置为只读:

.Model(model =>
      
          model.Field(it => it.foobar).Editable(false);
          ...

它可以在内联模式下按预期工作。但是当我将模式切换到弹出模式时,编辑器会显示整个结构,因此我可以编辑任何我想要的字段(那些也标记为不可编辑的字段)。

那么如何标记它们以便弹出编辑器只显示那些标记为可编辑的?

【问题讨论】:

【参考方案1】:

Popup editor 使用 MVC 的编辑器模板,完全独立于 Kendo 的。如果您想将该字段标记为只读,则需要在代码中的模型中附加元数据属性。例如:

public class MyClassUsedInGrid

    [System.ComponentModel.DataAnnotations.Editable(false)]
    public string foobar get;set;

更新:

抱歉,原来答案不完整。您需要创建一个自定义模板来处理这个问题,因为内置模板不支持它(我在我的项目中有这个并且忘记了它)。为此,请在 /Views/Shared/EditorTemplates/string.cshtml 下创建一个视图(我将在 Razor 中展示它,不过移植到 aspx 语法很容易)。

代码如下所示:

@model string
@if(ViewData.ModelMetadata.IsReadOnly)
    @Html.DisplayForModel()
else
    @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new  @class = "text-box single-line" )

这将正确处理可编辑元数据属性。当然这只是针对字符串,你应该对其他对象做类似的事情。如果您正在寻找其他内置模板的外观,请查看此站点:http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html

性能旁注:如果您只在应用程序的几个地方的一个地方执行此操作,最好将其放在 /Views/YourView/EditorTemplates/ 下。原因是内置模板被编译到框架中,并且通常工作得更快。或者将其保留在 Shared 文件夹中,但将其命名为 ExtendedString 之类的名称,然后在您查看标签属性,您可以使用显式 UI 提示设置可编辑,如下所示:

[System.ComponentModel.DataAnnotations.Editable(false)]
[System.ComponentModel.DataAnnotations.UIHint("ExtendedString")]
public string foobar get;set;

【讨论】:

更新了答案,很抱歉第一次回复不完整。 你真是个了不起的家伙!谢谢你百万次:-)。 您好,感谢您的解决方案。但是,当我将此 html.editor 用于该字段时,该字段会按预期隐藏,但该字段的标签仍然存在。您对此有什么想法吗,我该怎么办? 这个问题被制定为使字段只读。如果您希望字段显示在网格中,但弹出窗口根本不显示该字段(包括标签),您将必须创建一个自定义控件,该控件仅定义您想要显式查看的字段,而不依赖于元数据。 谢谢@macsux。这真的很有帮助!【参考方案2】:

根据 KendoUI 文档 (http://docs.telerik.com/kendo-ui/aspnet-mvc/validation),您应该使用 [HiddenInput(DisplayValue = false)] 注释属性

例子:

[HiddenInput(DisplayValue = false)]
public int Id  get; set; 

经过测试并且有效。

【讨论】:

【参考方案3】:

一个类似的、更简单但不太通用的解决方案是使用自定义编辑器模板:

column.Bound(a => a.foobar).EditorTemplateName("Empty");

然后将“Empty.cshtml”放入您的 Views/Shared/EditorTemplates 中,其中没有任何内容。

【讨论】:

以上是关于如何禁用弹出编辑器中某些列的编辑?的主要内容,如果未能解决你的问题,请参考以下文章

OroCommerce:在某些条件下禁用订单编辑

VSCode 如何禁用某些格式的代码错误检查(红色波浪线)?

如何为某些帖子类型禁用古腾堡/块编辑器?

easyui如何动态改变列的编辑属性

如何限制对 Access 中某些列的访问

WPF datagrid:禁用某些行中的编辑