2010-12-10 19 views
2

Ok, voici mon problème. J'essaie de faire passer un modèle de vue, qui comporte plusieurs listes, à mon avis. Ensuite, à mon avis, j'ai besoin d'éditer la liste différente. Ensuite, sur mon post, j'ai besoin de sauvegarder les modifications. Bien, quand je passe mon viewmodel à mon poste, il est vide! Quelqu'un peut-il expliquer ce que je fais mal?Passage de ViewModel de la vue au contrôleur

Contrôleur

public ActionResult ManageNewsArticles() 
    { 
     NewsViewModel newsViewModel = new NewsViewModel(); 

     newsViewModel.ListBreakingNews = db.NewsArticles.Where(n => n.PageSetupID == 1).ToList<NewsArticle>(); 
     newsViewModel.ListMainArticle = db.NewsArticles.Where(n => n.PageSetupID == 2).ToList<NewsArticle>(); 
     newsViewModel.ListSubNews1 = db.NewsArticles.Where(n => n.PageSetupID == 3).ToList<NewsArticle>(); 
     newsViewModel.ListSubNews2 = db.NewsArticles.Where(n => n.PageSetupID == 4).ToList<NewsArticle>(); 
     newsViewModel.ListSubNews3 = db.NewsArticles.Where(n => n.PageSetupID == 5).ToList<NewsArticle>(); 

     return View(newsViewModel); 
    } 

    [HttpPost] 
    public ActionResult ManageNewsArticles(NewsViewModel newsViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      db.SaveChanges(); 
      return RedirectToAction("Admin"); 
     } 

     return View(newsViewModel); 
    } 

ici est mon avis

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TrueNews.ViewModels.NewsViewModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Manage News Articles 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Manage News Articles</h2> 

    <% Html.EnableClientValidation(); %> 

    <% using (Html.BeginForm(Model)) {%> 
     <%: Html.ValidationSummary(true) %> 

     <fieldset> 
      <%: Html.EditorForModel(Model) %> 
      <p> 
       <input type="submit" value="Save" /> 
      </p> 
     </fieldset> 

    <% } %> 

    <div> 
     <%: Html.ActionLink("Back to Admin Controls", "Admin") %> 
    </div> 
</asp:Content> 

NewsViewModel

public class NewsViewModel 
    { 
     public List<NewsArticle> ListBreakingNews { get; set; } 
     public List<NewsArticle> ListMainArticle { get; set; } 
     public List<NewsArticle> ListSubNews1 { get; set; } 
     public List<NewsArticle> ListSubNews2 { get; set; } 
     public List<NewsArticle> ListSubNews3 { get; set; } 
    } // End of Class 
+0

Nous avons aussi besoin du code pour le modèle – CrazyDart

+0

vient d'ajouter le modèle de vue, rien de spécial –

+0

Essayez d'initialiser les listes dans le constructeur du modèle de vue. –

Répondre

0

Tout d'abord, je suppose que vous utilisez linq2sql ou quelque chose de similaire. Pour mettre à jour un objet dans votre base de données, cet objet doit être récupéré via un DataContext. Dans votre méthode "ManageNewsArticles" vous appelez db.SaveChanges(); mais comme aucun objet n'est chargé via db, aucune ligne ne sera mise à jour.

Une solution consiste à récupérer toutes les nouvelles que vous souhaitez mettre à jour, puis à utiliser la méthode Controller.UpdateModel pour mettre à jour vos instances réelles, puis à appeler le db.SaveChanges(); pour conserver vos modifications.

+0

J'utilise le framework d'entité. Et honnêtement, je n'ai pas vraiment terminé cette partie du processus de sauvegarde. Je l'ai juste mis là pour la réfrence. Je ne voulais pas finir ça jusqu'à ce que je récupère des données de mon point de vue. Et avec le framework Entity, ces données ne seraient-elles pas encore chargées dans l'objet db? –

+0

Ah désolé, doit être fatigué :) S'il vous plaît poster votre définition ViewModel. – alexn

+0

vient d'ajouter le modèle de vue –

0

Essayez d'utiliser le

UpdateModel(NewsViewModel); 
db.SaveChanges(); 
return RedirectToAction("Admin"); 
+0

Cela ne devrait pas être nécessaire puisque le modèle de vue est un paramètre de méthode d'action. Mais cela pourrait vous montrer les erreurs. –

0

Je ne l'ai jamais essayé d'utiliser EditorFor sur les listes d'objets complexes. Je devine que MVC est incapable d'encoder vos objets NewsArticle de telle sorte qu'ils peuvent être réassemblés en un objet NewsViewModel. Avez-vous essayé d'utiliser quelque chose comme Firebug pour voir à quoi ressemble le POST? Quelles sont les clés et les valeurs des paramètres de requête?

Vous pouvez simplement prendre un IEnumerable<NewsArticle>, puis l'analyser de nouveau en utilisant la même logique que celle utilisée dans la méthode ManageNewsArticles. Donnez un coup de feu, et laissez-nous savoir ce que vous découvrez.