如何在未绑定模型项时添加ModelState.AddModelError消息

时间:2012-10-17 14:27:32

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我是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错误消息..
任何建议

3 个答案:

答案 0 :(得分:31)

每个请求都会创建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();
}

答案 1 :(得分:11)

RedirectToAction将清除ModelState。您必须返回视图才能使用此数据。因此,第一个“if”案例将无效。另外,请确保您的视图中有一个控件(如ValidationSummary),它显示错误......这可能是第二种情况下的问题。

答案 2 :(得分:2)

RedirectToAction方法返回302,导致客户端被重定向。因此,当重定向是新请求时,ModelState会丢失。但是,您可以使用TempData属性,该属性允许您存储会话唯一的临时数据。然后,您可以在另一个控制器上检查此TempData,并在该方法中添加ModelState错误。