【问题标题】:Add model into model using Html helper HiddenFor C# MVC使用 Html 助手 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
  • 谢谢你,刘易斯 :)

标签: c# html .net model-view-controller html-helper


【解决方案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 时只需用一个空列表替换它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 2014-09-03
      • 2013-12-24
      相关资源
      最近更新 更多