将ViewModel从View传递给Controller

时间:2010-12-10 22:01:14

标签: asp.net-mvc asp.net-mvc-2

好的,这是我的问题。我试图传递我的视图模型,其中包含多个列表,我的观点。然后在我看来,我需要编辑不同的列表。然后在我的帖子上我需要保存编辑。虽然,当我将我的viewmodel传回我的帖子时,它是空的!有人可以解释我做错了吗?

控制器

    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 :(得分:0)

首先,我假设您使用linq2sql或类似的东西。

为了更新数据库中的对象,必须通过DataContext获取该对象。

在您的方法“ManageNewsArticles”中,您正在调用db.SaveChanges();,但由于没有通过db加载的对象,因此不会更新任何行。

解决方法是获取您要更新的所有新闻,然后使用Controller.UpdateModel方法更新您的实际实例,然后致电db.SaveChanges();以保留您的更改。

答案 1 :(得分:0)

尝试使用

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

答案 2 :(得分:0)

我从未尝试在复杂对象列表上使用EditorFor。我猜测MVC无法对NewsArticle个对象进行编码,以便可以将它们重新组合成NewsViewModel个对象。您是否尝试使用类似Firebug的内容来查看实际的POST是什么样的?什么是查询参数键和值?

您可以简单地使用IEnumerable<NewsArticle>,然后使用您在ManageNewsArticles方法中使用的相同逻辑重新解析它。试一试,让我们知道你发现了什么。