2012-10-17 4 views
20

私はMVC4を初めて使用しています。ここでは、削除操作が不可能なときに表示するModelState.AddModelErrorメッセージを追加しました。私のコントローラここ
モデルアイテムがバインドされていないときにModelState.AddModelErrorメッセージを追加するには

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"); 
      } 
     } 



<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) 
は私がモデル内の項目をチェックするためにビューでモデルアイテムのいずれかを渡すdidntの、私はにModelStateエラーメッセージが表示されますcouldntの。 。
任意の提案

答えて

29

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

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

2

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

関連する問題