6

ビューから ViewModel プロパティの属性 (データ注釈属性、検証属性、カスタム属性など) にアクセスする方法はありますか? プロパティが [必須] 属性を持つフィールドの横に、少し必要なインジケーターを追加したいことの 1 つです。

たとえば、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で複雑な型 (または でラップされた値型Nullable<T>) が必要かどうかRequiredAttributeがわかりますが、null 許容ではない値型については誤検知が発生します (それらは暗黙的に必要とされるため)。この問題は、次の方法で回避できます。

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

!metadata.ModelType.IsValueType注:の代わりに 使用する必要があります。これは、MVC に対して false を返すmodel.IsComplexTypeためModelMetadata.IsComplexType、文字列を含む複合型とは見なされないためです。

于 2011-09-22T01:43:10.677 に答える
1

ビューにロジックを追加するのは悪い習慣であるため、そのようにしないことをお勧めします。HtmlHelper または LabelExtension を作成してみませんか? メソッド内で ModelMetaProvider を呼び出して、プロパティに Required 属性が装飾されているかどうかを調べることができます。

于 2011-09-22T01:41:19.623 に答える