ASP.NET MVC:在视图上访问ViewModel属性

时间:2011-09-21 23:52:53

标签: asp.net-mvc asp.net-mvc-2 editorfor

有没有办法从视图中访问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>

2 个答案:

答案 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属性?