2016-09-26 125 views
1

我有以下视图模型,其中包括其他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); 
} 

所以我想这个问题是,从我的观点我的数据没有被正确地发送到我的视图模型。我希望你们能给我一个暗示我做错了什么。

问候,

+0

当你说“它只显示为空值。”指定什么显示空? viewModel为null或模型本身的属性为null? –

+0

您可以将不同的ViewModel数据发布到不同的操作。像'ViewModel1'数据到某个动作'/ vm1'和'ViewModel2'动作'/ vm2' –

+0

你可以使用元组来发送多个模型到一个视图 – Bharat

回答

0

编辑以下@Stephen Muecke的评论,听起来不像是这种情况。不过,我会在这里留下这个答案,因为我的第一个通话端口仍然是检查请求中的POST有效负载,以确保它按预期通过导线,所以此部分可能有用


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

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

听起来这是正在发布:
{"NameOfCustomer": "SomePerson", ....}

,不会被自动绑定服务器端的模式,因为ViewModel本身并不具有NameOfCustomer属性 - 相反,它是在举行一个子对象上viewModel1属性。因此,自动绑定会工作,如果下面是被张贴:
{"viewModel1": {"NameOfCustomer" : "SomePerson", ....}}

解决方案包括:
1)构建的有效载荷从JS自己张贴,确保结构正确如上
2反映了嵌套对象)创建扁平视图模型,所以从ViewModel1所有属性都直接在顶层的ViewModel
3)召开创建自定义的模型绑定

+2

'@ Html.TextBoxFor(m => m.viewModel1.NameOfCustomer)'用'name =“viewModel1.NameOfCustomer”'生成一个输入,该输入将正确绑定 –

+1

@StephenMuecke - 谢谢,看起来像是模型正在发生的奇怪事情在那个领域有约束力,但也许不是! – AdaTheDev

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(); 
+0

如果我理解正确,错误是MVC没有绑定到操作参数,而不是数据库保存的内容。 –

+0

Model1可能不是命名它的最佳方式,您是对的。但它是正确的模式。我会回答你的问题,如果我回到家里,直到现在,我要感谢大家在这里的努力,我非常感谢你的反馈! :) – RawMVC

+0

我只是不得不问/假设,因为在小提琴链接一切似乎都与绑定工作正常。 RawMVC也声明了这样的话:“如果我对控制器数据做了以下更改,但是这不起作用”,这些话让我相信数据仍然不会保存到数据库中。 – avi

相关问题