【问题标题】:How to send data from nested ViewModel to Controller如何将数据从嵌套的 ViewModel 发送到 Controller
【发布时间】:2015-05-17 13:34:49
【问题描述】:

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

型号:

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 助手,它将生成具有正确名称的局部视图。

【问题讨论】:

  • var result = Mapper.Map<OneVM>(item);
  • @FarhadJabiyev Mapper.Map<OneVM>(item); 但您将项目作为来源传递?而源应该是通过参数接收到的model
  • 您不想将item 转换为OneVM 吗?
  • @FarhadJabiyev 不,我更新了代码。我想将收到的模型中的属性映射到 item 并将收到的更改保存在 db 中
  • 你说的不工作是什么意思?

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


【解决方案1】:

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

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

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

相当于

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

【讨论】:

  • Helper 被调用但没有渲染。 Helper 是一个通用的解决方案,我为什么要避免它?正如您所给出的,没有帮助器的解决方案确实正确显示了部分视图并且数据提交正常。
  • 还应该有一种通用的方式来接收和更新视图中使用的那些属性。
  • 对不起,我不懂你们的cmets。在您的问题中,您使用@Html.RenderPartial("_OnePartial", Model.One),它是无效的并且什么都不做——它必须是@{ Html.RenderPartial("_OnePartial", Model.One) }。但即使您正确使用它,这也不会添加前缀(按设计)。正如我在回答的第一部分中指出的那样,您包含一个指向名为 PartialFor() 的自定义帮助方法的链接,如果您正确使用它,它确实有效,在您的情况下是 @Html.PartialFor(m => m.One, "_OnePartial")
  • 另外,如果您想为复杂对象或集合的属性生成控件,那么您应该使用EditorTemplate,而不是部分。只需将部分复制到/Views/Shared/EditorTemplates/OneVM.cshtml(注意文件名必须与类名匹配)并在主视图中使用@Html.EditorFor(m => m.One),生成的控件都将使用前缀正确命名。
【解决方案2】:

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

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

使用 HTML 助手,它看起来像这样:

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

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

【讨论】:

  • stackoverflow.com/questions/1488890/… 中的助手不起作用。
  • 如果你真的想使用局部视图,那么你可以考虑传递父模型。我给出的答案将适用于那种情况。如果您不想传递父模型,那么您可能必须使用@Html.Editor("SubModel.PropertyName", Model.PropertyName)
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
相关资源
最近更新 更多