【问题标题】:ASP.NET MVC: Accessing ViewModel Attributes on the viewASP.NET MVC:访问视图上的 ViewModel 属性
【发布时间】:2011-09-21 23:52:53
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您要查找的信息位于ViewData.ModelMetadata。 Brad Wilson 的 blog post series on Templates 应该解释这一切,尤其是 ModelMetadata 上的帖子。

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

    ModelMetadata.IsRequired 会告诉您RequiredAttribute 是否需要复杂类型(或包装在Nullable&lt;T&gt; 中的值类型),但它会为您提供不可为空的值类型的误报(因为它们是隐式的必需的)。您可以使用以下方法解决此问题:

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

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

    【讨论】:

    • 像上面的 EditorFor 这样的验证属性需要什么?在那篇博文中,Brad 说影响 ModelMetadata 的唯一属性是 [HiddenInput]、[UIHint]、[DataType]、[ReadOnly]、[DisplayFormat]、[ScaffoldColumn] 和 [DisplayName]
    • 可以通过 GetValidators 方法访问它们。我已经更新了我的答案以反映这一点。不过,我不确定其他非验证属性。
    • 获取属性信息的另一种方式是通过反射。例如typeof(YourModel).GetProperty("PropertyName").GetCustomAttributes(),但你绝对不应该在视图中这样做。
    【解决方案2】:

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

    【讨论】:

    • 好点,虽然我上面的例子被简化了。我的问题更多是关于如何确定该属性是否具有所需的属性。我见过 ModelMetaProvider 但它的 IsRequired 属性不依赖于 [Required] 属性。我想要的只是一个属性列表......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多