有没有办法从视图中访问ViewModel属性上的任何属性(无论是数据注释属性,验证属性还是自定义属性)?我想在其属性具有[Required]属性的字段旁边添加一些必需指示符之一。
例如,如果我的ViewModel看起来像这样:
public class MyViewModel
{
[Required]
public int MyRequiredField { get; set; }
}
我想在EditorFor模板中做一些事情,如下所示:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<int?>" %>
<div class="label-container">
<%: Html.Label("") %>
<% if (PROPERTY_HAS_REQUIRED_ATTRIBUTE) { %>
<span class="required">*</span>
<% } %>
</div>
<div class="field-container">
<%: Html.TextBox("") %>
<%: Html.ValidationMessage("") %>
</div>
答案 0 :(得分:7)
您要查找的信息位于ViewData.ModelMetadata
。 Brad Wilson的blog post series on Templates应该解释一切,特别是ModelMetadata上的帖子。
就其他ValidationAttributes而言,您可以通过ModelMetadata.GetValidators()
方法访问它们。
ModelMetadata.IsRequired
会告诉您Nullable<T>
是否需要复杂类型(或RequiredAttribute
中包含的值类型),但它会为不属于某些类型的值提供误报可以为空(因为它们是隐含要求的)。您可以使用以下方法解决此问题:
bool isReallyRequired = metadata.IsRequired
&& (!metadata.ModelType.IsValueType || metadata.IsNullableValueType);
注意:您需要使用!metadata.ModelType.IsValueType
而不是model.IsComplexType
,因为ModelMetadata.IsComplexType
返回false,因为MVC不认为是复杂类型,包括字符串。
答案 1 :(得分:1)
我建议不要这样做因为你在视图中添加逻辑是一种不好的做法。 为什么不创建HtmlHelper或LabelExtension,可以在方法中调用ModelMetaProvider并找出属性是否具有Required属性?