在MVC 3视图模型上使用Editable属性

Ste*_*alk 8 attributes asp.net-mvc-3

我希望使用属性将视图模型属性标记为只读,以便视图字段只在渲染视图中读取.应用System.ComponentModel.DataAnnotations.EditableAttribute似乎是我需要的确切属性但它似乎不起作用,即文本框字段仍然是可编辑的.我环顾四周,找不到答案,只找到一些相关的问题.下面应用的可编辑属性在呈现视图时不起作用.

[Display(Name = "Last Name")]
[Editable(false, AllowInitialValue = true)]
public string LastName { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

@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())
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*ebb 5

EditableAttribute文档状态:

数据字段上 EditableAttribute 属性的存在表明用户是否应该能够更改该字段的值。

此类既不强制也不保证字段可编辑。无论此属性是否存在,底层数据存储都可能允许更改该字段。

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

好吧,如果属性没有功能,为什么还要费心使用它呢?

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

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

还要记住,这些 DataAnnotation 属性不仅适用于 MVC 应用程序,它们还可以用于许多不同类型的应用程序。尽管 MVC 没有对这个 Attribute 做任何特别的事情,但其他框架已经实现了这个属性的功能/验证


Ter*_*rry 1

您有不同的创建场景吗?您允许初始值有什么特殊原因吗?我问是因为文档说:

由于您通常希望两个属性包含相同的值,因此在类构造函数中将AllowInitialValue 属性设置为AllowEdit 的值。

我在想如果你将它设置为 false 并且不明确声明它AllowInitialValue会起作用。