LIST< VIEWMODEL>视图对象在控制器mvc.net中返回null

本文关键字:net mvc 返回 null 控制器 VIEWMODEL 视图 对象 LIST | 更新日期: 2023-09-27 18:09:47

我有一个与视图绑定的类对象列表

@model List<Rep.Models.ContactReportSettingViewModel>
var accountArr = Model.Select(x => new { x.AccountId, x.CarrierId, x.AccountNumber, x.CarrierName, x.ClientId, x.ContactId }).Distinct();

在var object

上有一个循环
@foreach (var accountRow in accountArr)
{
  @Html.LabelFor(x => accountRow.AccountNumber, accountRow.AccountNumber, new { @id = accountRow.AccountId })              

但是当我点击保存时它返回null或者值或者没有设置类属性我在控制器中访问它,像这样:

public RESULT method(List<ContactReportSettingViewModel> model)
{ 
  model is null here
  // return View(model);            
}

但在模型中我得到null。我做错了什么?

使用

public RESULT method(ContactReportSettingViewModel model)
{ 
  // return View(model);            
}

然后在模型对象中我可以看到所有的属性但是值没有设置为这些属性

LIST< VIEWMODEL>视图对象在控制器mvc.net中返回null

你不能使用foreach循环来生成一个集合的表单控件,因为你生成的重复的name属性与你的模型没有关系(和重复的id属性是无效的html)。您可以在视图中使用for循环,也可以在模型中使用EditorTemplate

注意,您需要删除您的Linq .Select()代码,并在控制器GET方法中进行过滤。

在主视图中使用for循环(注意模型必须是IList<T>)

@model List<Rep.Models.ContactReportSettingViewModel>
@using (Html.BeginForm())
{
  @for (int i = 0; i < Model.Count; i++)
  {
    @Html.LabelFor(m => m[i].AccountNumber)
    @Html.TextBoxFor(m => m[i].AccountNumber)
    @Html.ValidationMessageFor(m => m[i].AccountNumber)
    .....
  }
  <input type="submit" .../>
}

使用EditorTemplate。在/Views/Shared/EditorTemplates/ContactReportSettingViewModel.cshtml中创建一个局部视图(注意文件的名称必须与模型类名称匹配)

@model Rep.Models.ContactReportSettingViewModel
@Html.LabelFor(m => m.AccountNumber)
@Html.TextBoxFor(m => m.AccountNumber)
@Html.ValidationMessageFor(m => m.AccountNumber)
  .....

,然后在主视图(注意模型可以是IEnumerable<T>)

@model IEnumerable<Rep.Models.ContactReportSettingViewModel>
@using (Html.BeginForm())
{
  @Html.EditorFor(m => m)
  <input type="submit" .../>
}

在这两种情况下,生成的html都将包含正确的name属性和索引器,这些索引器将在POST方法中绑定到您的模型

<input type="text" name="[0].AccountNumber" .. />
<input type="text" name="[1].AccountNumber" .. />

遵循以下检查清单

1)确保在视图的顶部添加了thing binding语句

@model List<ClassName>

2)然后检查你是否被提交到你提到的函数,并检查参数类型是否与你在绑定页面时提到的相同。

如果您使用HTML表类型结构来显示列表项,那么您还需要将列表与每行绑定。就像为Cell[0][0]绑定yourList[0]。EmployeeId, Cell[0][1] bind yourList[0]。