6

有什么方法可以从视图访问 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>
4

2 回答 2

8

您要查找的信息位于ViewData.ModelMetadata. Brad Wilson关于模板的博文系列应该解释这一切,尤其是关于ModelMetadata的博文。

就其他 ValidationAttributes 而言,您可以通过该ModelMetadata.GetValidators()方法访问它们。

ModelMetadata.IsRequired将告诉您 a 是否需要复杂类型(或包含在 中的值类型Nullable<T>RequiredAttribute,但对于不可为空的值类型(因为它们是隐式必需的),它会给您误报。您可以使用以下方法解决此问题:

bool isReallyRequired = metadata.IsRequired 
    && (!metadata.ModelType.IsValueType || metadata.IsNullableValueType);

注意:您需要使用!metadata.ModelType.IsValueType而不是 model.IsComplexType,因为ModelMetadata.IsComplexType返回 false 的 MVC 不认为是复杂类型,其中包括字符串。

于 2011-09-22T01:43:10.677 回答
1

我建议不要这样做,因为您在视图中添加了逻辑,这是一种不好的做法。为什么不创建一个HtmlHelper或者LabelExtension,可以在方法内部调用ModelMetaProvider,看看属性是否有Required属性修饰?

于 2011-09-22T01:41:19.623 回答