2009-01-03 4 views
1

J'ai un formulaire pour éditer des concerts..net mvc et l'édition de données avec des formulaires

L'action du contrôleur initial est appelée "Edition".

La forme des messages à une seconde action de contrôleur appelé « Mise à jour »

Ainsi, une fois le formulaire posté, j'utilise un ModelBinder sur mesure qui utilise bindingContext.ModelState.AddModelError pour ajouter des messages de validation au ModelState

l'action Mise à jour copntroller ressemble à ceci:

[AcceptVerbs("POST")] 
    public ActionResult Update(Guid id, FormCollection formCollection) 
    { 
     Gig gig = GigManager.GetByID(id); 
     try 
     { 
      UpdateModel<Gig>(gig); 
      GigManager.Save(gig); 
      return RedirectToAction("List"); 

     } 
     catch (Exception e) 
     { 
      return View(gig);  
     } 

    } 

Si le ModelBinder comporte des erreurs, une exception sera lancée par le modèle de mise à jour.

Cela signifie que RedirectToAction ("Edit") est appelé, de sorte que l'action de contrôleur "Edit" d'origine est appelée. Cela signifie que je ne verrai pas mes messages de validation et que toutes les données que l'utilisateur a ajoutées au formulaire seront réinitialisées aux valeurs d'origine!

Comment devrais-je aborder cette question?

J'ai inclus le "modifier" action ci-dessous:

[AcceptVerbs("GET")] 
    public ActionResult Edit(Guid id) 
    { 
     Gig gig = GigManager.GetByID(id); 

     SelectList days = CreateDays(1, 31, 1, gig.StartDate.Day); 
     ViewData["day"] = days; 

     SelectList months = CreateMonths(1, 12, 1, gig.StartDate.Month); 
     ViewData["month"] = months; 

     SelectList years = CreateYears(DateTime.Now.Year, DateTime.Now.Year + 10, 1, gig.StartDate.Year); 
     ViewData["year"] = years; 

     string bandNames =""; 
     string bandIds = ""; 
     foreach(Act act in gig.Acts) 
     { 
      bandNames += act.Name.Trim() + ", "; 
      if (act.Artist != null) 
      { 
       bandIds += act.Artist.ID + ";"; 
      } 
     } 

     ViewData["Bands"] = bandNames; 
     ViewData["BandIds"] = bandIds; 

     return View(gig); 

    } 

Cependant, je ne recevoir des messages de validation e

Répondre

1

Peut-être que cela vous aidera. Je viens de commettre un contrôleur qui fait un listing/edit admin. Il utilise la liaison sur une classe qui pourrait être utile. Consultez la toute fin du fichier pour voir une façon possible de gérer les verbes Get et Post. Notez que UpdateModelStateWithViolations est juste une aide pour ajouter des erreurs à ModelState.

 Controller.ModelState.AddModelError(violation.PropertyName, 
      violation.ErrorMessage); 

qui est affiché avec

<%= Html.ValidationSummary() %> 

http://www.codeplex.com/unifico/SourceControl/changeset/view/1629#44699

et la vue: http://www.codeplex.com/unifico/SourceControl/changeset/view/1629#54418

[AcceptVerbs("GET")] 
    [Authorize(Roles = "Admin")] 
    public ActionResult EditRole(Guid? RoleID) 
    { 
     Role role = null; 
     RoleForm form = new RoleForm { }; 
     if (RoleID.HasValue) 
     { 
      role = accountService.GetRole(RoleID.Value); 
      if (role == null) 
       return RedirectToAction("Roles"); 

      form = new RoleForm 
      { 
       RoleID = role.ID, 
       RoleName = role.Name, 
       Level = role.Level 
      }; 
     } 
     else 
     { 
      form = new RoleForm(); 
     } 

     ViewData.Model = form; 

     return this.PluginView(); 
    } 


    [AcceptVerbs("POST")] 
    [Authorize(Roles = "Admin")] 
    public ActionResult EditRole(Guid? RoleID, [Bind(Include = "RoleID,RoleName,Level", Prefix = "")] RoleForm form) 
    { 
     Role role = null; 
     if (RoleID.HasValue) 
     { 
      role = accountService.GetRole(RoleID.Value); 
      if (role == null) 
       return RedirectToAction("Roles"); 
     } 

     ServiceResponse<Role> response = accountService.AttemptEdit(form); 

     if (response.Successful) 
     { 
      TempData["Message"] = "Update Successfull"; 
     } 
     else 
     { 
      this.UpdateModelStateWithViolations(response.RuleViolations); 
     } 

     //ViewData["AllRoles"] = accountService.GetRolePage(new PageRequest(0, 50, "Name", typeof(string), true)).Page.ToArray(); 


     ViewData.Model = form; 

     return this.PluginView(); 
    } 
Questions connexes