我使用的剃刀在ASP.NET MVC3工作。 我有,我想启用禁用基于一个布尔属性的复选框的情况。 我的模型类有2个属性,如:
public bool IsInstructor { get; set; }
public bool MoreInstructorsAllowed { get; set; }
现在在我的CSHTML文件,我显示的复选框为:
@Html.EditorFor(model => model.IsInstructor)
我想这个复选框上MoreInstructorsAllowed财产的基础上启用禁用。 感谢您事先的解决方案。 :)
该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() });
但我得到的,每个人都有不同的风格...另外一个侧面说明。 如果你所厌恶的使用复选框方法是关系到生成的命名方案,即MVC框架访问此功能的方式包括html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)