我有一个类对象列表,它与这样的 View 绑定(bind)
@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 对象上有一个循环
@foreach (var accountRow in accountArr)
{
@Html.LabelFor(x => accountRow.AccountNumber, accountRow.AccountNumber, new { @id = accountRow.AccountId })
但是当我单击“保存”时,它返回 null 或值,或者未使用类属性设置我在 Controller 中访问它,如下所示:
public RESULT method(List<ContactReportSettingViewModel> model)
{
model is null here
// return View(model);
}
但是在模型中我得到了 null。我做错了什么?
当我使用这个
public RESULT method(ContactReportSettingViewModel model)
{
// return View(model);
}
然后在模型对象中我可以看到所有属性,但值未设置为这些属性
最佳答案
您不能使用 foreach
循环为集合生成表单控件,因为您生成重复的 name
与您的模型无关的属性(以及重复的 id
属性,这是无效的 html)。您可以使用 for
在 View 中循环,或使用 EditorTemplate
适合您的模型。
请注意,您需要删除 Linq .Select()
代码并在 Controller 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
中创建局部 View (注意文件名必须与模型类名匹配)
@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 方法中绑定(bind)到您的模型
<input type="text" name="[0].AccountNumber" .. />
<input type="text" name="[1].AccountNumber" .. />
关于c# - View 对象中的 LIST<VIEWMODEL> 在 Controller mvc.net 中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32202753/