web-dev-qa-db-fra.com

Comment ajouter un message ModelState.AddModelError lorsque l'élément de modèle n'est pas lié

Je suis nouveau sur MVC4. Ici, j'ai ajouté le message ModelState.AddModelError à afficher lorsque l'opération de suppression n'est pas possible.

  <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)


Dans mon contrôleur

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

Ici, je n'ai transmis aucun élément du modèle dans la vue pour vérifier l'élément dans le modèle et je n'ai pas pu obtenir le message d'erreur ModelState.
Aucune suggestion

23
kk1076

Le ModelState est créé à chaque demande, vous devez donc utiliser 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 effacera ModelState. Vous devez retourner une vue pour utiliser ces données. Par conséquent, le premier cas "si" ne fonctionnera pas. Assurez-vous également que vous disposez d'un contrôle dans votre vue (comme ValidationSummary) qui affiche l'erreur ... cela pourrait être le problème dans le deuxième cas.

12
Levi Botelho

La méthode RedirectToAction renvoie 302, ce qui entraîne la redirection du client. Pour cette raison, le ModelState est perdu car la redirection est une nouvelle demande. Vous pouvez cependant utiliser la propriété TempData qui vous permet de stocker une donnée temporaire unique à la session. Vous pouvez ensuite vérifier ce TempData sur l'autre contrôleur et ajouter une erreur ModelState dans cette méthode.

2
Ryan Amies