如何将数据从嵌套的ViewModel发送到Controller

时间:2015-05-17 13:34:50

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

我正在使用嵌套视图模型来显示基于用户角色的视图。

型号:

public class MainVM {
  //some properties
  public OneVM One {get; set;}
  public TwoVM Two {get; set;}
}

public class OneVM {
   //properties
}

public class TwoVM {
   //properties
}

正如here所写,只需要将主模型发送给控制器。我正在使用Automapper来映射已接收模型的属性。

控制器:

public ActionResult EditAction(MainVM model){
  var item = db.Table.Find(model.Id);
  //automapper to map
  AutoMapper.Mapper.Map(model.One, item); //does not work

  db.Entry(item).State = EntityState.Modified;
  db.SaveChanges();
}

这是正确的方法吗?我在这里做错了什么。

更新 这是我用来从部分视图中呈现嵌套视图模型的视图

查看:

@model MainVM

@Html.RenderPartial("_OnePartial", Model.One)

这个答案https://stackoverflow.com/a/6292180/342095定义了一个Html帮助器,它将生成具有正确名称的局部视图。

2 个答案:

答案 0 :(得分:2)

属性One的值将为空,因为您将OneVM的实例传递给部分(而不是主模型),因此表单控件未正确命名为前缀(需要是name="One.SomeProperty")。

您已添加指向PartialFor()帮助程序的链接(有效)但不使用它。在主视图中它需要

@Html.PartialFor(m => m.One, "_OnePartial")

相当于

@Html.Partial("_OnePartial", Model.One, 
    new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "One" }})

答案 1 :(得分:1)

问题可能在于你的HTML。如果嵌套了模型,那么属性的输入字段应如下所示:

<input type="text" name="SubModel.PropertyName" />

使用HTML帮助程序,它看起来像这样:

@Html.EditorFor(model => model.SubModel.PropertyName)

ASP.NET MVC Action无法知道,如果它不在您的HTML中,您希望填充子模型。