【问题标题】:LIST<VIEWMODEL> in view object is returning null in controller mvc.net视图对象中的 LIST<VIEWMODEL> 在控制器 mvc.net 中返回 null
【发布时间】:2015-08-25 11:24:21
【问题描述】:

我有一个类对象列表,它与这样的视图绑定

@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 或值或未使用类属性设置我在控制器中访问它,如下所示:

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

但是在模型中我得到了空值。我做错了什么?

当我使用它时

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

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

【问题讨论】:

  • 请发布您的所有代码,包括视图。
  • 它的public ActionResult method(List&lt;class&gt; model) 但如果它没有绑定它,因为你认为是错误的。发布您的代码。
  • 确保你在动作方法上装饰了[HttpPost]
  • 你是如何将模型与视图绑定的?我的意思是你观点之上的确切陈述?
  • 显示负责创建视图的操作/方法。您是否没有向视图发送空模型。您可能必须实例化您的模型: public ActionResult Index() { var model = new yourModel();返回视图(模型); }

标签: c# asp.net-mvc


【解决方案1】:

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

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

在主视图中使用for循环(注意模型必须是IList&lt;T&gt;

@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&lt;T&gt;

@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" .. />

【讨论】:

    【解决方案2】:

    遵循以下清单

    1) 确保您在视图顶部添加了事物绑定语句

    @model List<ClassName>
    

    2)然后检查您是否正在提交给您提到的功能,并检查参数类型是否与您在绑定页面时提到的相同。

    如果您使用 html 表格类型结构来显示列表项,那么您还需要将列表与每一行绑定。像 对于 Cell[0][0] 绑定 yourList[0].EmployeeId,Cell[0][1] 绑定 yourList[0].EmployeeName 等等,然后使用循环绑定所有列和行。

    【讨论】:

    • 我已经添加了这一点,因此我可以看到记录列表,但问题仅在于保存
    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多