我有几个可能需要或可能不需要显示的表单字段,具体取决于为其加载表单的实体。所以在我的模型中,我相应地分配了布尔属性。
表单中的每个字段都有一个对应的“标签”(不是 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 错误吗?Visual Studio 错误?Asp.Net 错误?
根据 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;
}
}
所以默认构造函数将标志设置为真,控制器在适当时修改标志。我还在视图中尝试了以下操作:
<td>
@if (!Model.DisplayDBAField)
{
@Html.Raw("DBA:")
}
</td>
并发现无论 Model.DisplayDBAField 中的值如何,无论是真还是假,“DBA:”都不会呈现!因此,无论我使用 @if (Model.DisplayDBAField){} 还是 @if (!Model.DisplayDBAField){},似乎代码本身在运行时都被完全忽略了。