使用 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 将模型添加到模型中的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jquery (Razor) 添加 Html 助手

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

Html.Hidden 和 Html.HiddenFor 有啥区别

ASP.Net MVC Html.HiddenFor 值错误

MVC3 Html.HiddenFor(Model => Model.Id) 不传回控制器

c#如何找出“m”从哪里来(m => m.SomeProperty)?