2009-06-30 10 views
0

J'ai un ProductController avec des actions Index (qui charge un formulaire vierge). La forme aussi des postes à lui-même que sa forme complexe et les éléments de formulaire comme dropdowns afficher les valeurs affichées le code est le suivantMessages de validation perdus dans POST-Redirect-GET dans MVC

public ActionResult Index() 
    { 
     int id; 
     id = Convert.ToInt32(Request.Form["ddlLendingType"]); 
     if (id == 0) 
      id = 1; 
     ProductCommonViewModel viewData = new ProductCommonViewModel(_prodRepository.Method1(),_prodRepository.Method2()) 
     return View(viewData); 
    } 

Lorsque je clique sur soumettre de la forme, il enregistre le produit et si elle échoue, elle devrait montrer les messages d'erreur de validation.

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Save(FormCollection fc) 
    { 
     Product product = new Product(); 
     try 
     { 
      ...fill out all properties from form collection 
      _prodRepository.SaveProduct(product); 

      return RedirectToAction("Index", "Product"); 
     } 
     catch (Exception ex) 
     { 
      TempData["Message"] = "An Error Occured while saving the product!"; 
      Validation.UpdateModelStateWithRuleViolation(product, ViewData.ModelState); 
      // WHEN I call redirect to action Index on this view I can see the TempData variable but I cannot see validation summary and individual validation messages.How do I persist the msgs across requests? 
     } 

    } 

La définition de la méthode d'aide est la suivante:

public static void UpdateModelStateWithRuleViolation(IRuleEntity entity, ModelStateDictionary dictModel) 
    { 
     List<RuleViolation> violations = entity.GetRuleViolations(); 

     foreach (var item in violations) 
     { 
      dictModel.AddModelError(item.PropertyName, item.ErrorMessage); 
     } 
    } 

Répondre

2

passe ModelState en TempData aussi.

BTW, au lieu de ceci:

public ActionResult Index() 
    { 
     int id; //and here You could join declaration with assignment 
     id = Convert.ToInt32(Request.Form["ddlLendingType"]); 

Vous pouvez faire ceci:

public ActionResult Index(int ddlLendingType) 
     { 

Et en utilisant FormCollection est une mauvaise pratique qui ne devrait pas être utilisé. Pour les cas extrêmes - créer un classeur de modèle personnalisé (CodeCampServer a un mécanisme de liaison assez agréable) ou un filtre d'action (source Kigg).

+0

Comment appeler ActionResult Index (int) de ActionResult Index()? ? – chugh97

+0

Pourquoi auriez-vous besoin de ça? Index (int ddlLendingType) est supposé être le remplacement de Index(). Mais si vous en avez besoin, il n'y a rien d'extraordinaire: "public ActionResult Index() {return Index (1);}" devrait fonctionner. –

1

J'ai eu un problème avec la préservation de TempData sur plusieurs demandes, je ne le suit, pour rafraîchir la TempData pour chaque Rediriger l'action:

protected override RedirectToRouteResult RedirectToAction(string actionName, 
    string controllerName, System.Web.Routing.RouteValueDictionary routeValues) 
{ 
    TempData["Notice"] = TempData["Notice"]; 
    TempData["Error"] = TempData["Error"]; 
    TempData["Warning"] = TempData["Warning"]; 
    return base.RedirectToAction(actionName, controllerName, routeValues); 
} 
Questions connexes