我使用Razor在ASP.NET MVC3中工作。我有一种情况,我想启用禁用基于布尔属性的复选框。我的模型类有2个属性,如:
public bool IsInstructor { get; set; }
public bool MoreInstructorsAllowed { get; set; }
现在在我的cshtml文件中,我将复选框显示为:
@Html.EditorFor(model => model.IsInstructor)
我希望此复选框在MoreInstructorsAllowed属性的基础上启用禁用。 提前感谢您的解决方案。 :)
答案 0 :(得分:3)
EditorFor
扩展方法将您的Model连接到位于EditorTemplates文件中的PartialView,该文件对应于Model的类型(因此在这种情况下,它需要是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
方法不接受ad hoc 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 Framework访问此功能的方式涉及html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)