web-dev-qa-db-ja.com

モデルアイテムがバインドされていないときにModelState.AddModelErrorメッセージを追加する方法

私は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エラーメッセージを取得できませんでした。
助言がありますか

23
kk1076

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();
}
32
VJAI

RedirectToActionはModelStateをクリアします。このデータを使用するには、ビューを返す必要があります。したがって、最初の「if」ケースは機能しません。また、エラーを表示するコントロール(ValidationSummaryなど)がビューにあることを確認してください。これは2番目の場合の問題である可能性があります。

12
Levi Botelho

RedirectToActionメソッドは302を返します。これにより、クライアントがリダイレクトされます。このため、リダイレクトは新しいリクエストであるため、ModelStateは失われます。ただし、TempDataプロパティを使用すると、セッションに固有の一時的なデータを保存できます。次に、他のコントローラーでこのTempDataを確認し、そのメソッドにModelStateエラーを追加できます。

2
Ryan Amies