【问题标题】: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);
          ...

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

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

【问题讨论】:

    标签: gridview kendo-ui


    【解决方案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 中,其中没有任何内容。

      【讨论】:

        猜你喜欢
        • 2019-05-09
        • 1970-01-01
        • 2011-12-05
        • 2011-02-21
        • 2010-12-27
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多