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,模型绑定将正常工作并拾取列表中的所有隐藏值.似乎是解决此问题的最简单方法.
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)
如何使用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)
Html.HiddenFor仅适用于一个值.在创建隐藏字段之前,您需要以某种方式序列化列表.
例如,如果列表的类型为字符串,则可以将列表加入逗号分隔列表,然后在控制器中回发后拆分列表.
| 归档时间: |
|
| 查看次数: |
73261 次 |
| 最近记录: |