如何从嵌套的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帮助器,它将生成具有正确名称的部分视图。
属性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中,你想填充它