如何从嵌套的ViewModel发送数据到控制器

本文关键字:数据 控制器 ViewModel 嵌套 | 更新日期: 2023-09-27 17:49:37

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

模型:

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

正如这里所写的,只有主模型需要发送控制器。我正在使用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帮助器,它将生成具有正确名称的部分视图。

如何从嵌套的ViewModel发送数据到控制器

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

您已经包含了一个链接到PartialFor()助手(它的工作),但不使用它。在主视图中,它需要是

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

相当于

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

问题可能出在你的HTML上。如果模型是嵌套的,那么属性的输入字段应该是这样的:

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

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

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

ASP。. NET MVC Action无法知道,如果子模型不在HTML中,你想填充它