ASP.NET MVC:如何在一个视图中使用多个模型?
我有以下视图模型,其中包括其他2种型号:ASP.NET MVC:如何在一个视图中使用多个模型?
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中获取数据,将它传递给我的实际模型,但它不起作用。它只显示为空值。如果我做了如下修改我的控制器的数据是存在的,但是,这并不工作,因为它应该:
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);
}
所以我想这个问题是,从我的观点我的数据没有被正确地发送到我的视图模型。我希望你们能给我一个暗示我做错了什么。
问候,
编辑以下@Stephen Muecke的评论,听起来不像是这种情况。不过,我会在这里留下这个答案,因为我的第一个通话端口仍然是检查请求中的POST有效负载,以确保它按预期通过导线,所以此部分可能有用
看起来好像是因为进入MVC动作的数据本质上是一个扁平视图模型,而动作中预期的模型是分层的。
如果查看浏览器开发工具中的网络选项卡,找到正在发出的POST请求,并检查发送到服务器的有效负载。
听起来这是正在发布:{"NameOfCustomer": "SomePerson", ....}
,不会被自动绑定服务器端的模式,因为ViewModel
本身并不具有NameOfCustomer属性 - 相反,它是在举行一个子对象上viewModel1
属性。因此,自动绑定会工作,如果下面是被张贴:{"viewModel1": {"NameOfCustomer" : "SomePerson", ....}}
解决方案包括:
1)构建的有效载荷从JS自己张贴,确保结构正确如上
2反映了嵌套对象)创建扁平视图模型,所以从ViewModel1所有属性都直接在顶层的ViewModel
类
3)召开创建自定义的模型绑定
'@ Html.TextBoxFor(m => m.viewModel1.NameOfCustomer)'用'name =“viewModel1.NameOfCustomer”'生成一个输入,该输入将正确绑定 –
@StephenMuecke - 谢谢,看起来像是模型正在发生的奇怪事情在那个领域有约束力,但也许不是! – AdaTheDev
您的代码应切实履行信息到控制器(看到类似的小提琴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();
当你说“它只显示为空值。”指定什么显示空? viewModel为null或模型本身的属性为null? –
您可以将不同的ViewModel数据发布到不同的操作。像'ViewModel1'数据到某个动作'/ vm1'和'ViewModel2'动作'/ vm2' –
你可以使用元组来发送多个模型到一个视图 – Bharat