我正在使用嵌套视图模型来显示基于用户角色的视图。
型号:
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帮助器,它将生成具有正确名称的局部视图。
答案 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中,您希望填充子模型。