フォームが読み込まれるエンティティに応じて、表示する必要がある場合とない場合があるいくつかのフォーム フィールドがあります。したがって、私のモデルでは、それに応じてブール値のプロパティが割り当てられています。
フォームの各フィールドには、対応する「ラベル」があります (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;
}
}
したがって、デフォルトのコンストラクターはフラグを true に設定し、コントローラーは適切な場合にフラグを変更します。ビューで次のことも試しました。
<td>
@if (!Model.DisplayDBAField)
{
@Html.Raw("DBA:")
}
</td>
そして、Model.DisplayDBAField の値に関係なく、それが true であるか false であるかに関係なく、「DBA:」は決してレンダリングされないことがわかりました。したがって、@if (Model.DisplayDBAField){} と @if (!Model.DisplayDBAField){} のどちらを使用しても、コード自体は実行時に完全に無視されるようです。