如何禁用弹出编辑器中某些列的编辑?
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 中,其中没有任何内容。
【讨论】:
以上是关于如何禁用弹出编辑器中某些列的编辑?的主要内容,如果未能解决你的问题,请参考以下文章