使用 Html 助手 HiddenFor C# MVC 将模型添加到模型中
Posted
技术标签:
【中文标题】使用 Html 助手 HiddenFor C# MVC 将模型添加到模型中【英文标题】:Add model into model using Html helper HiddenFor C# MVC 【发布时间】:2019-04-02 10:10:34 【问题描述】:我有一个类似的模型
public class Model
public int Value get; set;
public List<OtherModel> List get; set;
public class OtherModel
public int Value1 get; set;
public int Value2 get; set;
public bool IsPropTrue get; set;
我在一个视图中使用Model
,在该视图中循环List
以在表格中显示数据。
根据OtherModel
中的属性之一(IsPropTrue
)是真还是假,我想使用HiddenFor
html 帮助器并将数据发送到HttpPost
控制器。
@model Model
@foreach (var item in Model.List)
if (item.IsPropTrue)
@Html.HiddenFor(model=> item.Value1)
@Html.HiddenFor(model=> item.Value2)
我认为它不起作用,因为我应该以某种方式将这些属性添加到OtherModel
,它位于Model
内;但按照我现在的方式,我正在向Model
添加属性。
【问题讨论】:
啊,是的,我在上面犯了一个错误 :) 我在做@foreach(Model.List 中的变量项) 我根据 OP 的评论编辑了问题。它现在显示foreach
迭代 Model.List
。
谢谢你,刘易斯 :)
【参考方案1】:
你可以这样做:
@model Model
@foreach (var item in Model.List)
if (item.IsPropTrue)
@Html.HiddenFor(model => model.List[Model.List.IndexOf(item)].Value1)
@Html.HiddenFor(model => model.List[Model.List.IndexOf(item)].Value2)
这样绑定系统会将隐藏字段与模型中的 List OtherModel 绑定
【讨论】:
这看起来正是我所需要的,而且它有效,谢谢:) 如果item.IsPropTrue
false
在任何迭代中都不起作用(您将生成不会绑定的非连续索引器)
那么在这种情况下该怎么办呢?【参考方案2】:
如果你想根据模型向服务器发送一个数组,你必须在 @Html.HiddenFor 中使用索引器。
@model WebApplication1.Models.MyModel
<form>
@if (Model != null && Model.List != null)
for (int i = 0; i < Model.List.Count; i++)
if (Model.List[i].IsPropTrue)
@Html.HiddenFor(model => Model.List[i].Value1)
@Html.HiddenFor(model => Model.List[i].Value2)
<button type="submit">submit</button>
</form>
如果你想知道在模型上使用索引器的原因,我推荐How does MVC 4 List Model Binding work?
【讨论】:
【参考方案3】:考虑是否由视图或控制器操作来制定决策 - 您可以将所有内容发送回操作以进行决策。
在您的 Views/Shared 文件夹中,创建一个名为 EditorTemplates 的控制器 在这个文件夹中,添加一个名为 OtherModel 的局部视图 在此视图中,将模型设置为 OtherModel 并设置 Layout=null 在 EditorFor 中添加三个 OtherModel 字段(如果不显示 isPropTrue,则添加 HiddenFor)。此部分视图仅显示列表的一个实例。
在您的主视图中,像这样使用上述编辑器模型。 MVC 将为您的完整项目列表处理模型状态的所有渲染和回发。我们喜欢单行...
@Html.EditorFor(model => model.OtherModel)
当数据随后被回发到一个动作时,Model State 已经将所有显示的项目再次包装到一个列表中,因此您可以检查服务器上每个项目的 isPropTrue 值。
MVC 的唯一问题是你将一个空列表传递给一个视图,你会得到一个空值,所以当返回 null 时只需用一个空列表替换它
【讨论】:
以上是关于使用 Html 助手 HiddenFor C# MVC 将模型添加到模型中的主要内容,如果未能解决你的问题,请参考以下文章
@Html.HiddenFor 不适用于 ASP.NET MVC 中的列表
Html.Hidden 和 Html.HiddenFor 有啥区别
ASP.Net MVC Html.HiddenFor 值错误