私はMVC4が初めてです。ここで、削除操作が不可能な場合に表示するModelState.AddModelErrorメッセージを追加しました。
<td>
<a id="aaa" href="@Url.Action("Delete", "Shopping", new { id = Request.QueryString["UserID"], productid = item.ProductID })" style="text-decoration:none">
<img alt="removeitem" style="vertical-align: middle;" height="17px" src="~/Images/remove.png" title="remove" id="imgRemove" />
</a>
@Html.ValidationMessage("CustomError")
</td>
@Html.ValidationSummary(true)
私のコントローラーで
public ActionResult Delete(string id, string productid)
{
int records = DeleteItem(id,productid);
if (records > 0)
{
ModelState.AddModelError("CustomError", "The item is removed from your cart");
return RedirectToAction("Index1", "Shopping");
}
else
{
ModelState.AddModelError(string.Empty,"The item cannot be removed");
return View("Index1");
}
}
ここでは、モデルのアイテムを確認するためにビューのモデルアイテムを渡さなかったため、ModelStateエラーメッセージを取得できませんでした。
助言がありますか
ModelState
はリクエストごとに作成されるため、TempData
を使用する必要があります。
public ActionResult Delete(string id, string productid)
{
int records = DeleteItem(id,productid);
if (records > 0)
{
// since you are redirecting store the error message in TempData
TempData["CustomError"] = "The item is removed from your cart";
return RedirectToAction("Index1", "Shopping");
}
else
{
ModelState.AddModelError(string.Empty,"The item cannot be removed");
return View("Index1");
}
}
public ActionResult Index1()
{
// check if TempData contains some error message and if yes add to the model state.
if(TempData["CustomError"] != null)
{
ModelState.AddModelError(string.Empty, TempData["CustomError"].ToString());
}
return View();
}
RedirectToActionはModelStateをクリアします。このデータを使用するには、ビューを返す必要があります。したがって、最初の「if」ケースは機能しません。また、エラーを表示するコントロール(ValidationSummaryなど)がビューにあることを確認してください。これは2番目の場合の問題である可能性があります。
RedirectToActionメソッドは302を返します。これにより、クライアントがリダイレクトされます。このため、リダイレクトは新しいリクエストであるため、ModelStateは失われます。ただし、TempDataプロパティを使用すると、セッションに固有の一時的なデータを保存できます。次に、他のコントローラーでこのTempDataを確認し、そのメソッドにModelStateエラーを追加できます。