我是弗朗切斯科,我是新手。关于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)
我希望我足够清楚,我期待得到一些帮助。非常感谢!
答案 0 :(得分:1)
这是一个猜测:您的控制器方法(EditMonth)正在寻找名为Id和Month的两个参数。默认情况下,这些是绑定器在请求中查找的名称,当用户单击提交按钮时,该请求将被发送回服务器。
但是,我怀疑呈现页面上的属性的名称类似于EditViewModel_Id和EditViewModel_Month。所以活页夹无法匹配它们。
您可以覆盖活页夹的默认操作。但我认为更简单的方法是重新定义EditMonth方法,以便它需要EditViewModel对象:
[HttpPost]
public ActionResult EditMonth( EditViewModel model )
{...
然后名称应匹配(当然,您需要检查ModelState.IsValid,以确保绑定器在设置EditViewModel对象时不会遇到问题。)
BTW,我发现有用的东西是查看浏览器中呈现的页面中的源代码。然后,您可以看到活页夹要查找的确切名称(它们是HTML元素中的name = ...属性)。