我有几个表单字段可能需要显示,也可能不需要显示,具体取决于加载表单的实体。所以在我的模型中,我有相应的布尔属性。
表单中的每个字段都有一个相应的“标签”(不是html标签)。以下代码隐藏了html输入元素,但没有隐藏标签!?!?
<!-- DBA: _________________ -->
<tr>
<td>
@if (Model.DisplayDBAField)
{
@Html.Raw("DBA:")
}
</td>
<td>
@Html.TextBox("DoingBusinessAs", Model.DoingBusinessAs, new { style = string.Format("visibility: {0};", Model.DisplayDBAField ? "visible" : "hidden") })
</td>
</tr>
为了获得所需的显示,标签和输入都不显示,我必须按如下方式重写上述内容:
<!-- DBA: _________________ -->
<tr>
<td>
@Html.Raw(Model.DisplayDBAField ? "DBA:" : "")
</td>
<td>
@Html.TextBox("DoingBusinessAs", Model.DoingBusinessAs, new { style = string.Format("visibility: {0};", Model.DisplayDBAField ? "visible" : "hidden") })
</td>
</tr>
由于某种原因,代码块[@if(Model.DisplayDBAField){}]永远不会评估为true。这是一个Razor bug吗?,Visual Studio bug? Asp.Net bug?
Per MilkyWayJoe的请求:这是控制器中的代码:
if (!string.IsNullOrEmpty(hiddenFields))
{
profile.DisplayDBAField = !hiddenFields.Contains("DBA");
profile.DisplayVendorIDField = !hiddenFields.Contains("VendorID");
profile.DisplayContactNameFields = !hiddenFields.Contains("ContactName");
}
上面的代码工作正常,我单步执行它并正确设置/取消设置字段。 这是模型:
public class ProfileModel
{
public EntityProfile Entity { get; set; }
public bool DisplayDBAField { get; set; }
public bool DisplayVendorIDField { get; set; }
public bool DisplayContactNameFields { get; set; }
public bool DisplayDistributionMethodField { get; set; }
public bool DisplayCardPurposeField { get; set; }
public ProfileModel()
{
DisplayDBAField = true;
DisplayVendorIDField = true;
DisplayContactNameFields = true;
DisplayDistributionMethodField = true;
DisplayCardPurposeField = true;
}
}
因此默认构造函数将flags设置为true,并且控制器在适当时修改标志。我还在视图中尝试了以下内容:
<td>
@if (!Model.DisplayDBAField)
{
@Html.Raw("DBA:")
}
</td>
发现无论Model.DisplayDBAField中的值如何,无论是true还是false,“DBA:”都不会被渲染!所以,无论我使用@if(Model.DisplayDBAField){}还是@if(!Model.DisplayDBAField){},似乎代码本身在运行时都被完全忽略了。