在视图中循环列表并根据列表索引将值绑定到模型

Posted

技术标签:

【中文标题】在视图中循环列表并根据列表索引将值绑定到模型【英文标题】:Loop List In View And Bind Values to Model Depending on List Index 【发布时间】:2016-11-30 08:01:54 【问题描述】:

我有这个模型:

public class ClassRoom

    public List<Student> Students  get; set; 

public class Student

    public int ID  get; set; 
    public int Type  get; set; 
    public string Name  get; set; 
    public string LastName  get; set; 

ID 和 Type 的值已经满了,我需要创建一个视图,学生可以在其中添加他的姓名和姓氏。 所以我需要循环视图中的学生列表。

我正在做以下事情:

@model Models.ClassRoom

@
    ViewBag.Title = "Clas-s-room";



@if (Model != null)

<form action="Controller/Method">
    foreach (var item in Model.Students)
    
        @html.HiddenFor(model => model.ID) 
        <div>
            @Html.TextBoxFor(model => model.Name)
            @Html.TextBoxFor(model => model.LastName)
        </div>

    
    <input type="submit">
  </form>
  

我想最终提交一个 Clas-s-room 类型的模型,其中包含一个学生列表,每个 ID 都填写了姓名和姓氏

但这不起作用。

如何将视图中的值绑定到列表中某个索引上的项目

对于隐藏输入中的每个ID,我想保存写好的名字和姓氏。

请帮忙

我需要创建一个表单并最终提交包含完整学生列表的教室。我的 Controller 方法和视图中的类型应该是什么?

【问题讨论】:

但这不起作用。 - 为什么?有异常,有什么不显示?更详细地解释您对它应该如何工作的期望。 如何将新值发送到控制器? @Cubi 请检查我的问题的更新 @3615 无法将值绑定到某个特定索引。 Model 中没有“ID”或“Name”,它们在 Model.Students 中 请参阅@3615 的答案。更详细的解释(以及首选的EditorTemplate 方法),请参阅this answer 【参考方案1】:

如果要将模型发送回控制器,则需要正确生成命名。有几种方法,其中一种如下所示:

@using (Html.BeginForm("Index", "Home")) 
    <div style="margin-top: 100px;">
        @if (Model != null) 
            for (var i = 0; i <= Model.Students.Count - 1; i++) 
                @Html.HiddenFor(model => model.Students[i].ID)
                <div>
                    @Html.TextBoxFor(model => model.Students[i].Name)
                    @Html.TextBoxFor(model => model.Students[i].LastName)
                </div>
            
        
        <input type="submit" value="Go"/>
    </div>

并且在控制器中不要忘记添加:

[HttpGet]
public async Task<IActionResult> Index() 
    var clas-s-room = new ClassRoom();
     ... //add some students to the clas-s-room
    return View(clas-s-room);


[HttpPost]
public async Task<IActionResult> Index(ClassRoom classRoom) 
    ...

这里可以找到一些more reading。

【讨论】:

我们如何将每个值绑定到索引处的项目? 这是将模型 ClassRoom 发送到具有 Student Count = 0 列表的控制器方法。知道为什么吗? @HelpASisterOut 这假设要编辑学生,你的模型首先有学生吗? @HelpASisterOut,如果您的集合在生成视图时包含Student 对象,那么它们将被正确绑定。 @HelpASisterOut,我拒绝了您的编辑(我希望其他人也会这样做) - 添加 EditorFor(m =&gt; m.Students) 只会根据模板再次重复输入(这将毫无意义,因为 DefaultModelBinder 将只绑定for循环中控件生成的值,忽略EditorFor()生成的值

以上是关于在视图中循环列表并根据列表索引将值绑定到模型的主要内容,如果未能解决你的问题,请参考以下文章

如何将值存储在列表或数组中并将所有值绑定到数据表然后gridview

如何在使用while循环时将值附加到字典中的列表?

使用 for 循环有没有办法控制哪个 # 循环将值附加到列表中?

SQLite:将值列表绑定到“WHERE col IN (:PRM)”

将值从表单传递到表单

如何将值从动态列表视图传递到活动?