2010-12-10 12 views
2

Ok, hier ist mein Problem. Ich versuche, ein Ansichtsmodell von mir zu übergeben, das mehrere Listen enthält. Dann muss ich meiner Meinung nach die andere Liste bearbeiten. Dann auf meinem Post muss ich die Änderungen speichern. Obwohl, wenn ich mein Viewmodel zurück zu meinem Post gebe, ist es leer! Kann jemand erklären, was ich falsch mache?ViewModel von View zu Controller übergeben

-Controller

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); 
    } 

hier meine Ansicht

<%@ 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

Wir brauchen den Code für das Viewmodel auch – CrazyDart

+0

gerade hinzugefügt das Ansichtsmodell, nichts Besonderes –

+0

Versuchen Sie, die Listen im View-Modellkonstruktor zu initialisieren. –

Antwort

0

Zunächst einmal ist, gehe ich davon aus, dass Sie linq2sql oder etwas ähnliches verwenden.

Um ein Objekt in Ihrer Datenbank zu aktualisieren, muss dieses Objekt über einen DataContext abgerufen werden.

Innerhalb Ihrer Methode "ManageNewsArticles" rufen Sie db.SaveChanges();, aber da keine Objekte über db geladen werden keine Zeilen aktualisiert werden.

Eine Lösung ist das Abrufen aller Nachrichten, die Sie aktualisieren möchten, und verwenden Sie dann die Controller.UpdateModel Methode, um Ihre tatsächlichen Instanzen zu aktualisieren, und rufen Sie dann db.SaveChanges();, um Ihre Änderungen zu erhalten.

+0

Ich verwende das Entity-Framework. Und ehrlich gesagt habe ich diesen Teil des Speichervorgangs wirklich nicht beendet. Ich habe das nur für Reference geschrieben. Ich wollte das nicht beenden, bis ich Daten aus meiner Sicht zurückbekam. Und mit dem Entity-Framework würden diese Daten nicht noch in das db-Objekt geladen werden? –

+0

Ah Entschuldigung, muss müde sein :) Bitte posten Sie Ihre ViewModel-Definition. – alexn

+0

hat gerade das View-Modell hinzugefügt –

0

Versuchen Sie, die

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

Es sollte nicht notwendig sein, da das View-Modell ein Action-Methode-Parameter ist. Aber es könnte Ihnen die Fehler zeigen. –

0

mit mir nie EditorFor auf Listen von komplexen Objekten mit ausprobiert habe. Ich schätze, dass MVC Ihre NewsArticle Objekte nicht so kodieren kann, dass sie zu einem NewsViewModel Objekt zusammengefügt werden können. Haben Sie versucht, etwas wie Firebug zu verwenden, um zu sehen, wie die tatsächliche POST aussieht? Was sind die Abfrageparameterschlüssel und -werte?

Sie können in der Lage sein, einfach eine IEnumerable<NewsArticle> zu nehmen und diese dann mit derselben Logik, die Sie in der ManageNewsArticles-Methode verwenden, erneut zu analysieren. Geben Sie das eine Chance und lassen Sie uns wissen, was Sie herausfinden.

Verwandte Themen