[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())
其他属性完全正常,包括自定义验证属性.您能否告诉我数据注释可编辑属性是否在此上下文中起作用,应该如上所述那样工作还是需要做其他事情?谢谢.
解决方法
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.