扩展方法将EditorFor
您的模型连接到位于 EditorTemplates 文件中的 PartialView,该文件对应于模型的类型(因此在这种情况下,它需要是Boolean.cshtml
)。
您可以通过向编辑器模板添加条件逻辑来实现您的目标。您还需要为部分提供一种了解MoreInstructorsAllowed
属性具有什么值的方法,并且可以使用EditorFor
带参数的重载additionalViewData
来传递此信息。
老实说,更改处理布尔值的默认功能似乎对于您正在尝试做的事情有点多。如果这两个字段从根本上联系在一起,那么将两个字段组合起来并将部分视图连接到组合而不是布尔值本身会更有意义。我的意思是:
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.
唯一的问题是,现在您又回到了必须使用该CheckboxFor
方法才能应用“禁用”属性的问题,因为这些EditorFor
方法不接受临时 html 属性。有一个已知的解决方法涉及覆盖您ModelMetadataProvider
的属性并使用您在 ModelMetadataProvider 中提供处理的属性来装饰属性。此技术的工作示例可在以下网址获得: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() });
但我知道每个人都有不同的风格......另一个旁注。如果您对使用 Checkbox 方法的反感与生成的命名方案有关,那么 Mvc 框架访问此功能的方式涉及html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)