@ Html.HiddenFor不适用于ASP.NET MVC中的列表

Ant*_*ith 93 c# asp.net hidden-field asp.net-mvc-3

我正在使用包含List作为属性的模型.我正在使用从SQL Server中获取的项目填充此列表.我希望List隐藏在视图中并传递给POST操作.稍后我可能想要使用jQuery向此List添加更多项目,这使得数组不适合稍后进行扩展.通常你会用

@Html.HiddenFor(model => model.MyList)
Run Code Online (Sandbox Code Playgroud)

要完成此功能,但由于某种原因,POST中的List始终为null.

很简单的问题,任何人都知道为什么MVC会像这样?

Dan*_*kay 145

我刚刚遇到这个问题并通过以下方式解决了这个问题:

@for(int i = 0; i < Model.ToGroups.Length; i++)
{
    @Html.HiddenFor(model => Model.ToGroups[i])
}
Run Code Online (Sandbox Code Playgroud)

通过使用for而不是foreach,模型绑定将正常工作并拾取列表中的所有隐藏值.似乎是解决此问题的最简单方法.

  • 谢谢 - 很简单的解决方案.只需要一个小mod:需要引用对象的Id字段.因此,如果该字段被称为RowId,那么:`@ Html.HiddenFor(model => Model.ToGroups [i] .RowId)` (7认同)
  • 谢谢!救了我的夜晚. (5认同)
  • @user3186023 在这里回答一个非常老的评论,但也许其他人会有同样的问题:将 `for` 循环更改为:`for(int i = 0; i &lt; Model.Departments.Count(); i++)` (3认同)
  • 为我工作,即使我在集合中的模型上有多个字段.即`@ Html.EditorFor(model => Model.ToGroups [i] .Id)`下一次是`@ Html.EditorFor(model => Model.ToGroups [i] .Description)` - 两者都在for中-环.并且控制器能够将其映射到具有这些字段的模型列表.并且为了确保它们都没有出现在屏幕上,只需将它包围在`<div style ="display:none;"> </ div>中. (2认同)

Eri*_*sch 28

HiddenFor不像DisplayFor或EditorFor.它不适用于集合,只适用于单个值.

您可以使用MVC Futures项目中提供的Serialize HTML帮助程序将对象序列化为Hidden字段,或者您必须自己编写代码.更好的解决方案是简单地序列化某种ID,并在回发时从数据库中重新获取数据.


Mar*_*des 13

这有点像黑客攻击,但是如果@Html.EditorFor或者@Html.DisplayFor为你的列表工作,如果你想确保它在发布请求上发送但是不可见,你可以设置它来使用display: none;隐藏它,例如:

<div style="display: none;">@Html.EditorFor(model => model.MyList)</div>
Run Code Online (Sandbox Code Playgroud)


Ada*_*Hey 9

如何使用Newtonsoft将对象反序列化为json字符串,然后将其插入到Hidden字段中,例如(Model.DataResponse.Entity.Commission是一个简单的"CommissionRange"对象列表,如您在JSON中所见)

@using (Ajax.BeginForm("Settings", "AffiliateProgram", Model.DataResponse, new AjaxOptions { UpdateTargetId = "result" }))
   {
      string commissionJson = JsonConvert.SerializeObject(Model.DataResponse.Entity.Commission);
      @Html.HiddenFor(data => data.DataResponse.Entity.Guid)
      @Html.Hidden("DataResponse_Entity_Commission", commissionJson)
      [Rest of my form]
   }
Run Code Online (Sandbox Code Playgroud)

呈现为:

<input id="DataResponse_Entity_Commission" name="DataResponse_Entity_Commission" type="hidden" value="[{"RangeStart":0,"RangeEnd":0,"CommissionPercent":2.00000},{"RangeStart":1,"RangeEnd":2,"CommissionPercent":3.00000},{"RangeStart":2,"RangeEnd":0,"CommissionPercent":2.00000},{"RangeStart":3,"RangeEnd":2,"CommissionPercent":1.00000},{"RangeStart":15,"RangeEnd":10,"CommissionPercent":5.00000}]">
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我做了一些JS的东西来编辑隐藏字段中的json,然后回发

在我的控制器中,我再次使用Newtonsoft反序列化:

string jsonCommissionRange = Request.Form["DataResponse_Entity_Commission"];
List<CommissionRange> commissionRange = JsonConvert.DeserializeObject<List<CommissionRange>>(jsonCommissionRange);
Run Code Online (Sandbox Code Playgroud)


Kyl*_*man 6

Html.HiddenFor仅适用于一个值.在创建隐藏字段之前,您需要以某种方式序列化列表.

例如,如果列表的类型为字符串,则可以将列表加入逗号分隔列表,然后在控制器中回发后拆分列表.