Подтвердить что ты не робот

Как добавить сообщение 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.
Любые предложения

4b9b3361

Ответ 1

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

Ответ 2

RedirectToAction очистит ModelState. Вы должны вернуть представление, чтобы использовать эти данные. Поэтому первый случай "если" не будет работать. Кроме того, убедитесь, что у вас есть элемент управления в вашем представлении (например, ValidationSummary), который отображает ошибку... это может быть проблемой во втором случае.

Ответ 3

Метод RedirectToAction возвращает 302, из-за чего клиент перенаправляется. Из-за этого ModelState теряется, поскольку перенаправление является новым запросом. Однако вы можете использовать свойство TempData, которое позволяет хранить временную часть данных, уникальную для сеанса. Затем вы можете проверить этот TempData на другом контроллере и добавить в этот метод ошибку ModelState.