Asp.net mvc 将ViewModel从视图传递到控制器

Asp.net mvc 将ViewModel从视图传递到控制器,asp.net-mvc,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 2,好的,这是我的问题。我正在尝试将我的视图模型(其中包含多个列表)传递给我的视图。然后在我看来,我需要编辑不同的列表。然后在我的帖子上,我需要保存编辑。不过,当我将viewmodel传递回帖子时,它是空的!有人能解释一下我做错了什么吗 控制器 public ActionResult ManageNewsArticles() { NewsViewModel newsViewModel = new NewsViewModel(); newsViewMo

好的,这是我的问题。我正在尝试将我的视图模型(其中包含多个列表)传递给我的视图。然后在我看来,我需要编辑不同的列表。然后在我的帖子上,我需要保存编辑。不过,当我将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);
    }
public ActionResult managenewsacts()
{
NewsViewModel NewsViewModel=新的NewsViewModel();
newsViewModel.ListBreakingNews=db.NewsArticles.Where(n=>n.PageSetupID==1.ToList();
newsViewModel.ListMainArticle=db.NewsArticles.Where(n=>n.PageSetupID==2.ToList();
newsViewModel.ListSubNews1=db.NewsArticles.Where(n=>n.PageSetupID==3.ToList();
newsViewModel.ListSubNews2=db.NewsArticles.Where(n=>n.PageSetupID==4.ToList();
newsViewModel.ListSubNews3=db.NewsArticles.Where(n=>n.PageSetupID==5.ToList();
返回视图(newsViewModel);
}
[HttpPost]
公共操作结果管理新闻文章(NewsViewModel NewsViewModel)
{
if(ModelState.IsValid)
{
db.SaveChanges();
返回重定向到操作(“管理”);
}
返回视图(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>

管理新闻文章
管理新闻文章

新闻视图模型

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
公共类NewsViewModel
{
公共列表ListBreakingNews{get;set;}
公共列表ListMainArticle{get;set;}
公共列表ListSubNews1{get;set;}
公共列表ListSubNews2{get;set;}
公共列表ListSubNews3{get;set;}
}//下课

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

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

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


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

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

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

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

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

尝试使用

UpdateModel(NewsViewModel);  
db.SaveChanges();
return RedirectToAction("Admin");
尝试使用

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

我从未尝试在复杂对象列表上使用
EditorFor
。我猜MVC无法将您的
新闻文章
对象编码为可以重新组装为
新闻视图模型
对象的方式。您是否尝试过使用Firebug之类的工具来查看实际的
POST
外观?查询参数键和值是什么


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

我从未尝试在复杂对象列表上使用
EditorFor
。我猜MVC无法将您的
新闻文章
对象编码为可以重新组装为
新闻视图模型
对象的方式。您是否尝试过使用Firebug之类的工具来查看实际的
POST
外观?查询参数键和值是什么


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

我们需要viewmodel的代码刚刚添加了视图模型,没有什么特别的,初始化视图模型构造函数中的列表。我们需要viewmodel的代码刚刚添加了视图模型,初始化视图模型构造函数中的列表没有什么特别之处。我使用的是实体框架。老实说,我真的没有完成那部分的保存过程。我只是把它放在那里作为参考。在从视图中获取数据之前,我不想完成这项工作。如果使用实体框架,数据不会仍然加载到db对象中吗?啊,对不起,一定很累:)请发布您的ViewModel定义。我使用的是实体框架。老实说,我真的没有完成那部分的保存过程。我只是把它放在那里作为参考。在从视图中获取数据之前,我不想完成这项工作。如果使用实体框架,数据不会仍然加载到db对象中吗?啊,很抱歉,一定很累:)请发布您的ViewModel定义。这应该不是必需的,因为ViewModel是一个action方法参数。但它可能会向您显示错误,因为视图模型是一个动作方法参数,所以不需要这样做。但它可能会向您显示错误。