5

Razor を使用して ASP.NET MVC3 で作業しています。ブール値のプロパティに基づいてチェックボックスを無効にしたい状況があります。私のモデル クラスには、次のような 2 つのプロパティがあります。

public bool IsInstructor { get; set; }
public bool MoreInstructorsAllowed { get; set; }

私のcshtmlファイルでは、チェックボックスを次のように表示しています。

@Html.EditorFor(model => model.IsInstructor)

このチェックボックスで、MoreInstructorsAllowed プロパティに基づいて無効化を有効にします。解決策を事前にありがとう。:)

4

2 に答える 2

3

拡張メソッドはEditorFor、モデルのタイプに対応するEditorTemplatesファイルにあるPartialViewにモデルを接続します(したがって、この場合は、である必要がありますBoolean.cshtml)。

エディターテンプレートに条件付きロジックを追加することで、目的を達成できます。MoreInstructorsAllowedまた、プロパティの値を部分的に知る方法を提供する必要があります。また、パラメーターでEditorForオーバーロードを使用して、この情報を渡すことができます。additionalViewData

正直なところ、ブール値を処理するデフォルトの機能を変更することは、あなたがやろうとしていることには少しだけ思えます。これらの2つのフィールドが基本的にリンクされている場合は、2つのフィールドの合成を作成し、ブール値自体ではなく、合成に部分ビューを接続する方が理にかなっています。私が意味するのは:

public class InstructorProperty { 
    public bool IsInstructor { get; set; }
    public bool MoreInstructorsAllowed { get; set; }
}

および/Shared/EditorTemplates/InstructorProperty.cshtml

@model InstructorProperty

//  ...  Your view logic w/ the @if(MoreInstructorsClause) here.

唯一の問題は、メソッドがアドホックhtml属性を受け入れないCheckboxForため、「disabled」属性を適用するためにメソッドを使用する必要があるという問題に戻ったことです。ModelMetadataProviderで処理を提供する属性を使用してプロパティをEditorForオーバーライドし、装飾することを含む既知の回避策があります。ModelMetadataProviderこの手法の実用的な例は、次のURLで入手できます。http://aspadvice.com/blogs/kiran/archive/2009/11/29/Adding-html-attributes-support-for-Templates- 2D00 -ASP.Net-MVC- 2.0-Beta_2D00_1.aspx。ただし、これには、(1)ブールビューをオーバーライドしてhtmlをハードコーディングするか、そこでCheckboxForを使用するか、(2)でCheckboxForメソッドを使用するかのいずれかが含まれます。InstructorPropertyビュー、または(3)htmlをビューにハードコーディングしInstructorPropertyます。このような些細なことでデザインを複雑にしすぎるのは意味がないと思うので、私の解決策はこのInstructorPropertyビューを使用して次のように追加することです。

@Html.CheckboxFor(_=>_.IsInstructor, 
    htmlAttributes: (Model.MoreInstructorsAllowed ? null : new { disabled = "disabled"} ).ToString().ToLowerInvariant() });        

しかし、私は誰もが異なるスタイルを持っていると思います...もう1つのサイドノート。チェックボックスメソッドの使用に対する嫌悪感が、生成された命名スキームに関連している場合、MvcFrameworkがこの機能にアクセスする方法には次のものが含まれます。html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)

于 2012-06-06T08:54:36.250 に答える