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

ajb*_*ven 4 asp.net-mvc editorfor asp.net-mvc-2

有没有办法从视图中访问ViewModel属性上的任何属性(无论是数据注释属性,验证属性还是自定义属性)?我想在其属性具有[Required]属性的字段旁边添加一些必需指示符之一.

例如,如果我的ViewModel看起来像这样:

public class MyViewModel
{
    [Required]
    public int MyRequiredField { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

我想在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>
Run Code Online (Sandbox Code Playgroud)

Ben*_*thy 7

您正在寻找的信息是ViewData.ModelMetadata.Brad Wilson 关于模板博客文章系列应该解释一切,尤其是关于ModelMetadata的帖子.

对于其他ValidationAttributes,您可以通过该ModelMetadata.GetValidators()方法访问它们.

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

bool isReallyRequired = metadata.IsRequired 
    && (!metadata.ModelType.IsValueType || metadata.IsNullableValueType);
Run Code Online (Sandbox Code Playgroud)

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