Передача ViewModel из View в контроллер - PullRequest
2 голосов
/ 11 декабря 2010

Хорошо, вот моя проблема. Я пытаюсь передать мою модель представления, в которой есть несколько списков. Затем, на мой взгляд, мне нужно отредактировать другой список. Тогда в моем посте мне нужно сохранить изменения. Хотя, когда я передаю свою view-модель обратно в мой пост, она пуста! Может кто-нибудь объяснить, что я делаю не так?

Контроллер

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

вот мой взгляд

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

Ответы [ 3 ]

0 голосов
/ 11 декабря 2010

Попробуйте использовать

UpdateModel(NewsViewModel);  
db.SaveChanges();
return RedirectToAction("Admin");
0 голосов
/ 13 декабря 2010

Я никогда не пытался использовать EditorFor в списках сложных объектов.Я предполагаю, что MVC не может закодировать ваши NewsArticle объекты таким образом, чтобы их можно было собрать в NewsViewModel объект.Вы пытались использовать что-то вроде Firebug, чтобы увидеть, как выглядит POST?Что такое ключи и значения параметров запроса?

Вы можете просто взять IEnumerable<NewsArticle> и затем проанализировать его, используя ту же логику, которую вы используете в методе ManageNewsArticles.Сделайте это, и дайте нам знать, что вы узнали.

0 голосов
/ 11 декабря 2010

Прежде всего, я предполагаю, что вы используете linq2sql или что-то подобное.

Чтобы обновить объект в вашей базе данных, этот объект должен быть извлечен через DataContext.

Внутри вашего метода "ManageNewsArticles" вы вызываете db.SaveChanges();, но, поскольку нет никаких объектов, загруженных через db, строки не будут обновлены.

Решением этой проблемы является получение всех новостей, которые вы хотите обновить, и затем использование метода Controller.UpdateModel для обновления ваших фактических экземпляров, а затем вызов db.SaveChanges(); для сохранения ваших изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...