【问题标题】:Pass nested lists from View to Controller using viewmodels使用视图模型将嵌套列表从视图传递到控制器
【发布时间】:2011-03-24 14:35:21
【问题描述】:

我是 Francesco,我是新手。关于视图和控制器之间发布的数据,我对 ASP.NET MVC3 有疑问。我的目标是使用表单编辑数据库中的特定记录,然后将其发布回控制器,控制器负责检查记录的字段并将它们提交到数据库中。 数据通过使用 ViewModel 从 Controller 传递到 View,因此 DefaultDataBinding 在这种情况下不适用。我尝试了很多方法,我监控了与 Fiddler 的通信,但我无法解决我的问题。 Phil Haack描述的方法不起作用,FormCollection也不起作用。

这里有代码:

ViewModels:我将它传递给 View 以创建一个表。名称和项目名称列表(表格列标题)只是要显示。我想返回 Id、月份(它们作为参数正确传递并表示表行标题),最重要的是 Items 的 ActualValue 及其 Id(我的数据库中有一个关联表,其中包含 Id、Itemid 和 Month 作为键)

public class EditViewModel
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }

    [ScaffoldColumn(false)]
    public int Month { get; set; }

    public string Name { get; set; }

    public List<ItemViewModel> ItemList { get; set; }
}

public class ItemViewModel
{
    [ScaffoldColumn(false)]
    public int ItemId { get; set; }

    public string ItemName { get; set; }

    public float ActualValue { get; set; }
}

View:View 被强类型化为 ViewModels.EditViewModel 并通过提交按钮发送字段。我必须使用 foreach 循环来生成表格,因为我不知道提前有多少项

控制器:控制器必须更新从与特定 ID 和月份相关的视图传递的每个 kpi。

            [HttpPost]
    public ActionResult EditMonth(int Id, int Month, //FormCollection kpiValues)

我希望我足够清楚,我期待得到一些帮助。非常感谢!

【问题讨论】:

  • 对不起摩西,我是新来的,我必须改进我发布问题的方式。我的问题是“如何将包含未知数量元素的嵌套列表(在 qanother 列表中)从强类型视图传递给控制器​​?”

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


【解决方案1】:

这是一个猜测:您的控制器方法 (EditMonth) 正在寻找名为 Id 和 Month 的两个参数。默认情况下,当用户单击提交按钮时,活页夹将在请求中查找这些名称,该请求被发送回服务器。

但是,我怀疑渲染页面上的属性命名为 EditViewModel_Id 和 EditViewModel_Month。所以活页夹将无法匹配它们。

您可以覆盖活页夹的默认操作。但我认为更简单的方法是重新定义 EditMonth 方法,以便它需要一个 EditViewModel 对象:

[HttpPost]
public ActionResult EditMonth( EditViewModel model )
{...

然后名称应该匹配(当然,您需要检查 ModelState.IsValid,以确保绑定器在设置 EditViewModel 对象时没有遇到问题)。

顺便说一句,我发现有帮助的是查看浏览器中呈现的页面中的源代码。然后,您可以看到活页夹将在其上查找匹配项的确切名称(它们是 HTML 元素中的 name=... 属性)。

【讨论】:

  • 亲爱的马克,感谢您的回复。 [HttpPost]EditMonth 操作方法可以正确看到参数 Id 和 Month。操作方法根本看不到的是 List ItemList。我还尝试创建一个与 EditViewModel 相同的帖子模型,除了 Name 属性(我需要它只是为了在视图中显示名称)。我猜活页夹的问题是它必须在视图模型中填充一个嵌套列表......
猜你喜欢
  • 2015-10-06
  • 2013-11-20
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
相关资源
最近更新 更多