2010-06-22 6 views
0

J'ai un simple blog MVC 2 que je construis au fur et à mesure que j'apprends. Ma page d'édition a le titre, le corps, la date, activé et les balises. Les tags sont là où mon problème entre en jeu. J'ai une table Tags et une table Posts et tags sont associés à un article via la table PostTag. J'ai ma configuration de modèle linq correctement et j'ai même l'action Ajouter HttpPost fonctionnant. Mon problème est avec l'affichage Modifier, où je veux supprimer les balises qui étaient sur le modèle d'objet Post au moment du chargement, et les mettre à jour avec les balises qui sont sur le modèle d'objet Post quand il est HttpPost-ed. Comment puis-je accomplir cela puisque mon modèle est complexe? Mon point de vue Edition:HttpPost Action pour mettre à jour mon modèle avec les enfants de la page d'édition

[HttpPost, Authorize, ValidateInput(false)] 
public ActionResult Edit(int id, FormCollection form) 
{ 
    Post p = repo.GetPost(id); 

    if (p == null) 
     return View("NotFound"); 

    if (ModelState.IsValid) 
    { 
     try 
     { 
      UpdateModel(p); 

      //Do something here to update the model p.TagList child model 
      // the p.TagList object is not updated through UpdateModel 

      repo.Save(); 

      return RedirectToAction("Post", "Blog", new { id = p.PostID }); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.Message); 
      ModelState.AddRuleViolations(p.GetRuleViolations()); 
     } 
    } 
    return View(p); 
} 

Ce que je l'ai fait pour aider à traduire les balises sur la page d'édition d'une collection d'objets est à travers un objet TagListString qui sérialise juste chaque nom de tag séparés par un espace. Quand je le reporte, je peux facilement reconstruire l'objet TagList en itérant à travers mon TagListString - mais il n'est pas mis à jour!

J'ai essayé plusieurs façons de mettre à jour le modèle TagList. Boucler et faire repo.Delete() sur les existants et ensuite ajouter puis reconstruire et ajouter les nouveaux. J'ai essayé de créer une nouvelle collection et d'ajouter les nouveaux objets Tag de cette façon. Voici quelques-unes des choses que j'ai essayées.

public void UpdateTagList(System.Data.Linq.EntitySet<PostTag> postTags, string tagListString) 
{ 
    db.PostTags.DeleteAllOnSubmit(postTags); 
    db.PostTags.InsertAllOnSubmit(GenerateTagListFromString(tagListString, postTags.SingleOrDefault().Post)); 
} 

private System.Data.Linq.EntitySet<PostTag> GenerateTagListFromString(string tagListString, Post post) 
{ 
    System.Data.Linq.EntitySet<PostTag> tagList = new System.Data.Linq.EntitySet<PostTag>(); 

    foreach (var t in tagListString.Trim().Split(' ')) 
    { 
     //look for this tag name in cache (MvcApplication.AllTags) 
     Tag found = MvcApplication.AllTags.SingleOrDefault(item => item.TagName.Trim().ToLower() == t.Trim().ToLower()); 

     //new PostTag for this new Post 
     PostTag pt = new PostTag(); 
     pt.Tag = found ?? new Tag() { TagName = t }; 
     pt.Post = post; 

     tagList.Add(pt); 
    } 
    return tagList; 
} 

Répondre

0

Tout d'abord, je vous recommande de traiter toutes les données de formulaire avec une coutume ModelBinder, de sorte que votre action contrôleur reçoit un objet « Post » avec les données scalaires mises à jour et les bonnes balises, au lieu de recevoir FormCollection .

Ensuite, la solution diffère légèrement selon que vous utilisez .net 3.5 avec EF 1.0 ou .net 4.0 avec EF 4.0. Pouvez-vous fournir cette information afin que je puisse vous aider davantage? Merci.

+0

Initialement, j'avais implémenté ma méthode pour prendre un objet Post mais mon objet enfant n'était pas passé correctement, est-ce parce que je n'avais pas de ModelBinder personnalisé spécifiant comment lier cela? J'utilise .NET 3.5 – MaseBase

+0

J'ai créé mon ModelBinder personnalisé, c'était beaucoup plus simple que je ne le pensais, mais maintenant, quand j'appelle repo.Save(), je ne sauvegarde pas mon objet dans la base de données. Si je fais repo.Add (p) avant la sauvegarde, alors il l'ajoute magnifiquement. Mais comment puis-je informer le référentiel de mon post mis à jour? Ma classe de référentiel n'a aucune connaissance de ce qui a changé pour une raison quelconque. – MaseBase

Questions connexes