2010-12-13 15 views
1

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? Je ne suis pas inquiet à propos de la sauvegarde de l'information en ce moment, je m'inquiète juste de ramener les données au contrôleur. Le ViewModel est nul quand je frappe cette partie.Problèmes Passage de ViewModel avec les données de View to Controller

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 

Répondre

2

Je ne pouvais pas votre point de vue pour afficher correctement en utilisant la syntaxe EditorForModel, mais je ne répliquer votre problème et trouvé cet article qui fournit un moyen de le résoudre:

http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

J'ai créé un NewsArticle rapide de la table contenant des colonnes Id et des trucs et a la forme suivante dans la vue:

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

    <% for (int i = 0; i < Model.ListBreakingNews.Count; i++) 
     { %> 
    <div> 
     Id</div> 
    <div> 
     <%= Html.TextBox(string.Format("ListBreakingNews[{0}].Id", i), Model.ListBreakingNews[i].Id) %> 
    </div> 
    <div> 
     Name</div> 
    <div> 
     <%= Html.TextBox(string.Format("ListBreakingNews[{0}].Stuff", i), Model.ListBreakingNews[i].Stuff) %> 
    </div> 
    <% } %> 
    <p> 
     <input type="submit" value="Save" /> 
    </p> 
</fieldset> 
<% } %> 

et les éléments de la liste ont été adoptées dès leur publication. J'ai aussi trouvé que précédemment vous aviez Html.BeginForm (Model) qui quand je l'ai ajouté n'a rien à être traversé dans le modèle de vue - je suis seulement un débutant à MVC donc je ne sais pas pourquoi cela se produit mais mon code ci-dessous a fonctionné uniquement avec Html.BeginForm() et non Html.BeginForm (Model).

J'espère que cela aide.

+0

Si je pouvais courir et vous serrer dans mes bras je voudrais! Ça a marché! Je deviens fou depuis environ 3 jours là-dessus. –

+0

Je suis content que vous l'ayez trié maintenant. – JayneT