EditorFor
扩展方法将您的Model与位于EditorTemplates文件中的PartialView连接起来,该PartialView对应于Model的类型(因此在这种情况下,它需要是
Boolean.cshtml
)。
您可以通过向Editor模板添加条件逻辑来实现您的目标。您还需要为Partial视图提供一种知道
MoreInstructorsAllowed
属性值的方式,并使用带有
additionalViewData
参数的
EditorFor
重载来传递此信息。
说实话,更改处理布尔值的默认功能似乎对您要做的事情来说有些过度了。如果这两个字段在本质上是相关联的,那么将这两个字段组合起来并将一个Partial视图连接到组合而不是连接到布尔值本身会更有意义。我的意思是:
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
方法才能应用“disabled”属性的问题,因为
EditorFor
方法不接受即席html属性。已知的解决方法涉及覆盖您的
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)在
InstructorProperty
视图中使用
CheckboxFor
方法,或者(3)将html硬编码到
InstructorProperty
视图中。我认为为了这么微不足道的事情而过分复杂化设计没有意义,因此我的解决方案是在这个
InstructorProperty
视图中添加:
@Html.CheckboxFor(_=>_.IsInstructor,
htmlAttributes: (Model.MoreInstructorsAllowed ? null : new { disabled = "disabled"} ).ToString().ToLowerInvariant() });
但我明白每个人的风格都不同... 另外一个小提示是,如果你不想使用复选框方法是因为生成的命名方案,那么 Mvc 框架访问此功能的方式涉及 html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)