拡張メソッドは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)