2017-01-18 1 views
-1

Je souhaite modifier ces données dans la base de données et le retour de nouvelles données
lorsque je clique sur enregistrer des données de bouton ne change pas Voici contrôleur:Modifier dans mvc4 ne fonctionne pas

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(CustomPerformancePerformersModel customPerformancePerformersModel) 
    { 
     if (ModelState.IsValid) 
     { 
      int perfromanceId = Convert.ToInt32(TempData.Peek("CurrentPerformanceId")); 
      customPerformancePerformersModel.performanceObj = db.Performances.Where(x => x.PerformanceId == perfromanceId).FirstOrDefault(); 
      db.Entry(customPerformancePerformersModel.performanceObj).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.EventId = new SelectList(db.Events, "EventId", "Name", customPerformancePerformersModel.performanceObj.EventId); 
     ViewBag.VenueId = new SelectList(db.Venues, "VenueId", "Name", customPerformancePerformersModel.performanceObj.VenueId); 
     ViewBag.Performers = new SelectList(db.PerformerPerformances, "Performers", "Name", customPerformancePerformersModel.performanceObj.PerformerPerformances); 
     return View(customPerformancePerformersModel.performanceObj); 
    } 

et voici le code html:

<div class="form-group"> 
     @Html.LabelFor(model => model.performanceObj.IsVisible, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      <div class="checkbox"> 
       @Html.EditorFor(model => model.performanceObj.IsVisible) 
       @Html.ValidationMessageFor(model => model.performanceObj.IsVisible, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.performanceObj.IsFeatured, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      <div class="checkbox"> 
       @Html.EditorFor(model => model.performanceObj.IsFeatured) 
       @Html.ValidationMessageFor(model => model.performanceObj.IsFeatured, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
+0

Votre action d'édition est-elle appelée? – Forlani

+0

pouvez-vous coller votre formulaire HTML complet avec bouton de soumission et javascript connexes le cas échéant? Avez-vous eu un point de rupture sur votre action Modifier? –

+1

Je suppose qu'en faisant customPerformancePerformersModel.performanceObj = db.Performances.Where (x => x.PerformanceId == perfromanceId) .FirstOrDefault(); vous remplacez tous les changements vers le modèle. ainsi à sauve que ce qui était déjà là. à la place, obtenez la performance de la base de données comme vous l'avez déjà fait, mais dans une variable locale. puis changer ses données avec les données de la CustomerPerformanceModel puis enregistrez cette variable locale – StijnvanGaal

Répondre

1

Effectuez les actions suivantes:

if (ModelState.IsValid) 
    { 
     int perfromanceId = Convert.ToInt32(TempData.Peek("CurrentPerformanceId")); 

     // There is no need to use Where. FirstOrDefault has an overload using predicates. 
     var savedPerformance = db.Performances.FirstOrDefault(x => x.PerformanceId == perfromanceId); 

     // If the performance couldn't be found, then you could add the error to the model state and return it to the view. 
     if(savedPerformance == null) 
      return View(customPerformancePerformersModel.performanceObj); 

     // Update properties from performance in database with new performance. 
     savedPerformance.someProperty = customPerformancePerformersModel.performanceObj.someProperty; 

     db.Performances.Attach(savedPerformance); 
     db.Entry(savedPerformance).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
+0

savedPerformance retourné null –

+1

cette partie n'a pas de sens pour moi 'savedPerformance = customPerformancePerformersModel.performanceObj,' parce que vous définissez avant cette ligne vous définissez à nouveau ici. – KSib

+0

@amalmansour si savedPerformance renvoie null, cela signifie qu'il n'a pas été trouvé dans la base de données. Vous devriez vérifier si perfromanceId a la bonne valeur. KSib Vous avez raison. Je voulais définir la propriété par propriété. Je vais mettre à jour –

0

Idéalement votre code ressemble à quelque chose comme ce qui suit:

public ActionResult Edit(int performanceId) 
{ 
    var model = db.Performances.FirstOrDefault(m => m.PerformanceId == performanceId); 
    return View(model); 
} 

[HttpPost] //[HttpPatch] is technically correct, but most people I see tend to use only GET and POST actions. 
[ValidateAntiForgeryToken] 
public ActionResult Edit(CustomPerformancePerformersModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(model).State = EntityState.Modified; 
     db.SaveChanges(); 
    } 
} 

Vous récupérez l'objet à partir de la base de données et le suivi dans votre action GET, la modification à l'aide de votre formulaire, puis le marquer modifié dans votre action de mise à jour. Ceci est strictement si vous utilisez le modèle MVC, et aura l'air différent (voir ci-dessous) si vous utilisez des données distinctes et des modèles de vue. Vous aurez probablement des problèmes avec cette approche si votre vue n'a pas de champs (cachés ou non) pour toutes les propriétés de votre modèle.

En utilisant des modèles de données distincts et afficher, vous auriez quelque chose comme ceci:

public ActionResult Edit(int performanceId) 
{ 
    var performance = db.Performances.FirstOrDefault(m => m.PerformanceId == performanceId); 
    var model = new PerformanceViewModel(performance); //In this constructor, copy properties from your data model to your view model 
    return View(model); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(PerformanceViewModel model) 
{ 
    var performance = db.Performances.FirstOrDefault(m => m.PerformanceId == model.PerformanceId); 
    model.Update(performance); 
    db.SaveChanges(); 

} 

Avec un modèle de vue échantillon:

public class PerformanceViewModel 
{ 

    public PerformanceViewModel(CustomPerformanceePerformersModel model) 
    { 
     PerformanceId = model.performanceObj.PerformanceId; 
     IsVisible = model.performanceObj.IsVisible; 
     IsFeatured = model.performanceObj.IsFeatured; 
    } 
    public int PerformanceId { get; set; } 

    public bool IsVisible { get; set; } 

    public bool IsFeatured { get; set; } 


    public void Update(CustomPerformancePerformersModel model) 
    { 
     model.performanceObj.IsVisible = IsVisible; 
     model.performanceObj.IsFeatured = IsFeatured; 
    } 
} 

Ici vous créez un objet séparé (modèle vue) qui contient uniquement les données nécessaires pour votre vue, puis utilise les données de cet objet pour mettre à jour votre modèle de données. Je préfère cela parce qu'il faut pouvoir modifier directement la base de données, et parce que vous pouvez effectuer n'importe quel traitement intermédiaire nécessaire (lancer des chaînes vers bools, et cetera) dans la méthode Update (Model).