5

我正在使用 Razor 在 ASP.NET MVC3 中工作。我有一种情况,我想启用禁用基于布尔属性的复选框。我的模型类有 2 个属性,例如:

public bool IsInstructor { get; set; }
public bool MoreInstructorsAllowed { get; set; }

现在在我的 cshtml 文件中,我将复选框显示为:

@Html.EditorFor(model => model.IsInstructor)

我希望此复选框根据 MoreInstructorsAllowed 属性启用禁用。提前感谢您的解决方案。:)

4

2 回答 2

3

扩展方法将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)

于 2012-06-06T08:54:36.250 回答
-1
@if (Model.MoreInstructorsAllowed)
  {
    @Html.EditorFor(model => model.IsInstructor)
  }
  else
  {
    @Html.EditorFor(model => model.IsInstructor, new { htmlAttributes = new { @disabled = "disabled" } })
  }
于 2021-09-07T23:00:17.223 回答