ASP.NET MVC:如何在一个View中使用多个模型?

时间:2016-09-26 11:04:57

标签: c# asp.net asp.net-mvc razor

我有以下ViewModel,其中包含2个其他模型:

public class ViewModel
{
   public ViewModel1 viewModel1 { get; set; }
   public ViewModel2 viewModel2 { get; set; }
}

我的观点如下:

@Html.TextBoxFor(m => m.viewModel1.NameOfCustomer)
@Html.TextBoxFor(m => m.viewModel2.ProductCategory)

最后是控制器:

public ActionResult CreateNewOrder(ViewModel viewModel)
{

  Model1 myModel1 = new Model1()
  {
    NameOfCustomer = viewModel.viewModel1.NameOfCustomer
  };

  db.Orders.Add(myModel1);
  db.SaveChanges();

  return View(viewModel);
}

问题是,如果我想从我的ViewModel获取数据将其传递给我的实际模型,它就不起作用。它只显示null作为值。如果我对控制器数据进行了以下更改,那么这不会起作用:

public ActionResult CreateNewOrder(ViewModel viewModel)
{
  // that works
  viewModel.viewModel1.NameOfCustomer = "John John";

  Model1 myModel1 = new Model1()
  {
    myModel1.NameOfCustomer = viewModel.viewModel1.NameOfCustomer
  };

  db.Orders.Add(myModel1);
  db.SaveChanges();

  return View(viewModel);
}

所以我猜问题是,我的视图中的数据没有正确发送到我的ViewModel。我希望你们能给我一个提示我做错了什么。

此致

2 个答案:

答案 0 :(得分:0)

在@Stephen Muecke的评论之后

编辑,听起来并非如此。但是,我在这里留下这个答案,因为我的第一个停靠点仍然是检查请求中的POST有效负载,以确保它按预期通过线路,所以这部分可能很有用

看起来它是因为进入MVC操作的数据本质上是一个展平的视图模型,而行动中预期的模型是分层的。

如果查看浏览器的开发工具中的网络选项卡,找到正在发出的POST请求,并检查发送到服务器的有效负载。

听起来像是这样:
{"NameOfCustomer": "SomePerson", ....}

由于ViewModel本身没有NameOfCustomer属性,因此它不会自动绑定到您的模型服务器端 - 而是在{{1}中保存的子对象上属性。因此,如果发布以下内容,自动绑定将起作用:
viewModel1

解决方案包括:
1)构建有效负载,自己从JS发布,确保结构正确反映嵌套对象,如上所述 2)创建一个展平的视图模型,因此ViewModel1中的所有属性都直接保存在{"viewModel1": {"NameOfCustomer" : "SomePerson", ....}}类的顶层 3)创建自定义模型绑定器

答案 1 :(得分:0)

您的代码应该正确地将信息传递给控制器​​(请参阅类似的小提琴here

这篇文章:

Model1 myModel1 = new Model1()
  {
    NameOfCustomer = viewModel.viewModel1.NameOfCustomer
  };

  db.Orders.Add(myModel1);
  db.SaveChanges();

你确定你在做正确的事吗?您正在创建Model1类型变量并将其添加到数据库中的Orders。你有任何错误吗?也许正确的代码应该是这样的:

      Order myModel1 = new Order ()
      {
        NameOfCustomer = viewModel.viewModel1.NameOfCustomer
      };

      db.Orders.Add(myModel1);
      db.SaveChanges();