Controller と View の間で ViewBag 変数を渡していますが、常に同じ値の false を持っています。デバッグ中に上書きされていないことを確認しました。
その目的は、特定の条件下で、ViewBag アイテムが true に設定されている場合に、View に追加のマークアップを表示することです。データがビューに送り返される直前に true に設定されますが、ビューでのデバッグ中に false と表示されます。そのため、必要な追加のマークアップが表示されません。
ViewBag アイテムで間違っていることは何ですか?
ビューからの適切なマークアップは次のとおりです。
if (ViewBag.Refresh == true)
{
<tr>
<td colspan="5">
<b>@Html.Label("lbl_Templates", "Templates:")</b>
</td>
</tr>
<tr>
@foreach (var item in Model.Templates)
{
<td>
@Html.CheckBoxFor(model => Convert.ToBoolean(item.IsChecked));
@Html.LabelFor(model => item.TemplateName)
</td>
}
</tr>
<tr>
<td colspan="5">
<b>@Html.Label("lbl_Guarantor", "Guarantor(s):")</b>
</td>
</tr>
<tr>
@foreach (var item in Model.Guarantors)
{
<td>
@Html.CheckBoxFor(model => Convert.ToBoolean(item.isChecked));
@Html.LabelFor(model => item.GuarantorFirstName + " " + item.GuarantorLastName)
</td>
}
</tr>
}
コントローラーの Index メソッドでは、最初は false に設定されています。
public ActionResult Index()
{
ViewBag.Refresh = false;
ViewBag.Error = "";
return View();
}
これがコントローラーメソッドです。「else」ロジックに該当することに注意してください。ビューに戻るとすぐに (return Json ステートメントを介して):
[HttpPost]
public ActionResult Refresh(string loanID, string loanType, string selectedVal)
{
try
{
bool dbHasRows = db.ChkLoanFields(Convert.ToInt32(loanID));
if (!dbHasRows)
{
ViewBag.Refresh = false;
ViewBag.Error = "Details not available for this LoanId";
return Json(new { success = false });
}
else
{
ViewBag.Refresh = true;
bool tmplst = true;
bool gurlst = true;
ViewModelTemplate_Guarantors tg = db.SelectViewModelTemplate_Guarantors(Convert.ToInt32(loanID), loanType, selectedVal);
if (tg.Templates.Count() == 0)
{
tmplst = false;
ViewBag.Error = "Templates not available for this LoanType";
}
if (tg.Guarantors.Count() == 0)
{
gurlst = false;
ViewBag.Error = "Guarantors not available for this LoanId";
}
return Json(new { success = true, templist = tmplst, guarlist = gurlst });
}
}
catch (Exception ex)
{
throw ex;
}
}