asp.net-mvc-3 – 在MVC 3视图模型上使用Editable属性

我希望使用属性将视图模型属性标记为只读,以便视图字段只在渲染视图中读取.应用System.ComponentModel.DataAnnotations.EditableAttribute似乎是我需要的确切属性,但它似乎不起作用,即文本框字段仍然可以编辑.我环顾四周,找不到答案,只找到一些相关的问题.下面应用的可编辑属性在呈现视图时不起作用.
[display(Name = "Last Name")]
[Editable(false,AllowInitialValue = true)]
public string LastName { get; set; }

我可以使用像这样的视图助手函数来实现只读行为,但我的偏好是在模型属性上使用属性.

@functions {
    object getHtmlAttributes()
    {
    if (@ViewBag.Mode == "Edit")
    {
      return new {style = "width:100px;background:#ff6;",@readonly = "readonly"};
    }

    return new { style = "width:100px;" };  
}
} 

@Html.TextBoxFor(model => model.FirstName,getHtmlAttributes())

其他属性完全正常,包括自定义验证属性.您能否告诉我数据注释可编辑属性是否在此上下文中起作用,应该如上所述那样工作还是需要做其他事情?谢谢.

解决方法

EditableAttribute documentation声明:

The presence of the EditableAttribute attribute on a data field indicates whether the user should be able to change the field’s value.

This class neither enforces nor guarantees that a field is editable. The underlying data store might allow the field to be changed regardless of the presence of this attribute.

不幸的是,这意味着使用此属性对MVC中的验证没有任何影响.这感觉不对,但是如果你想一想在MVC框架中实现它需要什么,这是有道理的.例如,在典型的“编辑”视图中,用户执行初始GET请求,其中填充模型(通常来自DB记录)并将其提供给要呈现给用户的视图.然后用户进行一些编辑,然后提交表单.提交表单会导致从POST参数构造Model的新实例.验证器很难确保该字段在两个对象实例中具有相同的值,因为其中一个实例(来自GET请求的第一个实例)已经被处理掉了.

好吧,如果属性没有功能,为什么甚至懒得使用它?

我最好的猜测是他们希望开发人员在他们的代码中使用它来显示意图.更实际的是,您还可以编写自己的自定义代码来检查此属性的存在…

AttributeCollection attributes = TypeDescriptor.GetAttributes(MyProperty);
if (attributes[typeof(EditableAttribute)].AllowEdit)
{
   // editable
}
else
{
   // read-only
}

还要记住,这些DataAnnotation属性不仅适用于MVC应用程序,它们还可用于许多不同类型的应用程序.即使MVC没有对此属性做任何特殊处理,other frameworks have implemented functionality/validation for this attribute.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....