ASP.NET MVC 3模型和viewmodel类

时间:2011-08-11 05:21:56

标签: asp.net asp.net-mvc asp.net-mvc-3 model viewmodel

我有一个viewmodel,它有一个嵌套类,与其他模型类没有关联。我可以在这个嵌套类(ClassX)中填充必要的数据来显示视图中的那些但我无法在post动作中从嵌套类(通过MyViewModel)中获取数据,就像我在post post中作为另一个参数一样。它出现在原始viewmodel(MyViewModel)中,但其属性为null / 0。

public class MyViewModel
{
   public MyViewModel()
   {
      classX = new ClassX();
   }

   public ClassX classX;
   public int attrA {get;set;}
   ...
}
public class ClassX {}

//
// POST: /MyModel/Create
public ActionResult Create(MyViewModel myvm, **ClassX cx**, FormCollection collection)
{}

我的问题:我可以通过viewmodel类从嵌套类中读取数据吗?

2 个答案:

答案 0 :(得分:0)

http://goneale.com/2009/07/27/updating-multiple-child-objects-and-or-collections-in-asp-net-mvc-views/这是一篇很好的文章

  MyViewModel myViewModel= new MyViewModel();
  UpdateModel(myViewModel, "MyViewModel");
  myViewModel.myViewModel= new myViewModel();
  UpdateModel(myViewModel.classX, "User.classX");

答案 1 :(得分:0)

如果我正确理解了您的问题,那么您需要ClassX cx操作参数方法BindAttribute.Prefix。这样,模型绑定器将正确绑定它的值。 Bind.Prefix的值应为MyViewModel中ClassX属性的名称,在您的示例中,字符串为"classX"

//
// POST: /MyModel/Create
public ActionResult Create(MyViewModel myvm, [Bind(Prefix = "classX")]ClassX cx, FormCollection collection)
{}

理念如下 - 在客户端,当您提交表单时,其值将像这样发送到服务器

attrA=someValue
classX.SomeProperty=someValue
classX.SomeOtherProperty=someOtherValue

传递给动作参数时,此name = value字符串对将转换为对象。从等式左侧的名称与MyViewModel的属性名称匹配,并且ClassX参数保持为空。但是,然后指定Prefix = "classX",模型绑定器将等于左侧的点后的字符串与ClassX属性名称匹配,因此也应该填充ClassX的值。