使用viewmodels将嵌套列表从View传递到Controller

时间:2011-03-24 14:35:21

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

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

这里有代码:

ViewModels:我将它传递给View以创建表格。只显示名称和项目名称列表(表格列标题)。我想要返回Id,月份(它们作为参数正确传递并表示表格行标题),最重要的是项目的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强类型为ViewModels.EditViewModel,并通过提交按钮发送字段。我必须使用 foreach 循环生成一个表,因为我不知道预先有多少项

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

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

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

1 个答案:

答案 0 :(得分:1)

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

但是,我怀疑呈现页面上的属性的名称类似于EditViewModel_Id和EditViewModel_Month。所以活页夹无法匹配它们。

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

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

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

BTW,我发现有用的东西是查看浏览器中呈现的页面中的源代码。然后,您可以看到活页夹要查找的确切名称(它们是HTML元素中的name = ...属性)。