我有以下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。我希望你们能给我一个提示我做错了什么。
此致
答案 0 :(得分:0)
编辑,听起来并非如此。但是,我在这里留下这个答案,因为我的第一个停靠点仍然是检查请求中的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();